旅遊n個城市,但並不是每一條路線花費都是一樣的。想把所有的城市都旅遊一遍,但是花費最小。
輸入格式
第一行輸入一個整數n,表示有n個城市
接下來有一個n*n的矩形,表示每兩個城市之間的火車花費,每兩個城市之間的花費不會超過10000。
輸出格式
輸出一個整數,表示從1號城市把所有的景點旅遊一遍並且回到1號城市的最小花費。
樣例輸入
4
0 1 1 1
1 0 2 1
5 5 0 6
1 1 3 0
樣例輸出
8
#include<iostream>
using namespace std;
int mp[10][10];
int n,ans=10000;
bool vis[10];
void dfs(int a,int cnt,int sum){//a表示當前在第a個城市,cnt表示已經去了幾個城市,sum表示當前已經花費
if(sum>ans){//如果花的多餘上一次,剪掉
return;
}
if(cnt==n){//遞歸出口
ans=min(ans,sum+mp[a][1]);//要加上返回第一個城市的路費
return;
}
vis[a]=true;//標記這個城市去過
for(int i=1;i<=n;i++){//挑一個城市去
if(!vis[i]){
dfs(i,cnt+1,sum+mp[a][i]);
}
}
vis[a]=false;
}
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;
}