题目
思路
递归出口:如果你到达的点已经到达了所有城市。
最优性剪枝:如果你当前到达点的花费已经超过了当前的最优解,就直接退出。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n;
int mp[N][N];
bool vis[N];
int ans=200000;
//local当前在哪个城市
//cnt当前走了几个城市
//sum当前花费的💴
void dfs(int local,int cnt,int sum){
if(sum>=ans){
return;
}
if(cnt==n){
ans=min(ans,sum+mp[local][1]);//加上到1的费用
return;
}
vis[local]=1;//当前城市已经走过(如果没有会超时)
for(int i=1;i<=n;i++){//枚举当前城市可以到达的下一个城市。
if(!vis[i]){
// vis[i]=1;//可以去掉
dfs(i,cnt+1,sum+mp[local][i]);//当前在第i个城市,已经选了cnt+1个城市,费用为sum+到i的费用
// vis[i]=0;
}
}
vis[local]=0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
}
}
dfs(1,1,0);
cout<<ans<<endl;
return 0;
}