1 条题解
-
1
由于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
- 上传者