1 条题解

  • 1
    @ 2026-3-4 16:15:02

    由于n比较小 考虑全排列2-n 然后首尾连1即可 比如样例 1->2->4->3->1我们排列出了2 4 3再加上1-2的距离和3-1的距离即可

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long 
    int n;
    int vis[15],a[15][15],d[15];//vis判断是否选过,a数组存距离,d用来存选的数字
    int ans=1e9;
    void dfs(int i,int tot){// 目前在选第i个城市
        if(i==n+1){//选完了
            tot+=a[d[n]][1];//回到1
            ans=min(ans,tot);
           // for(int i=1;i<=n;i++)cout<<d[i]<<" ";
        //    cout<<endl;
            return ;
        }
        //枚举填1-9
        for(int k=2;k<=n;k++){//去第k个城市
            if(vis[k])continue;
            vis[k]=1;
            d[i]=k; //第i个城市去k       
            tot+=a[d[i-1]][k];//前一个城市到k
            dfs(i+1,tot);
            vis[k]=0;//回溯
            tot-=a[d[i-1]][k];//推荐不改tot的值:直接dfs(i+1,tot+a[d[i-1]][k]);
        }
    }
    signed main() {
        cin>>n;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin>>a[i][j];
            }
        }
        d[1]=1;
        vis[1]=1;//标记1开始
        dfs(2,0);
        cout<<ans;
    } 
    
    

    n更大可以考虑使用dp 洛谷P1359租用游艇

    • 1

    信息

    ID
    835
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    8
    已通过
    1
    上传者