輸入:一個整數n,接下來有n*n的矩形,代表兩個城市之間的路程花費,每兩個城市之間的花費不超過10000.
輸出:一個整數,代表從1號城市把所有景點旅游一遍且回到1號城市的最小花費。
樣例輸入:
4
0 1 1 1
1 0 2 1
5 5 0 6
1 1 3 0
樣例輸出:
8
思考:
1.搜完所有城市即代表一次深度優先搜索,再加上從終點返回到1號城市的花費即一次完整的花費費用。所以每次深搜結束(搜完所有城市)代表一種花費結果。記錄所有深搜中的最小花費即可。
2在每次深搜過程中標記已經到達的城市,繼續搜索還未到達的城市,一次深搜結束后,將標記清除。進行下次深搜,從而得到不同的花費結果。
例如:四個城市1,2,3,4.
搜索方案:
1->2->3->4、1->2->4->3、1->3>2->4、1->3->4->2、1->4->2->3、1->4->3->2 ......

1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n; 5 int ans=100000000; 6 int G[100][100]; 7 bool vis[100]={0}; 8 void dfs(int u,int cnt,int sum){ 9 //最優性剪枝:在一次深搜過程中費用sum>當前走完所有路程所需的費用ans, 10 //因此sum肯定不是最小值,不用在向下層搜索了,函數返回繼續尋找另一個方案。 11 if(sum>ans){ 12 return; 13 } 14 if(cnt==n){ 15 ans=min(ans,sum+G[u][1]); 16 } 17 vis[u]=true;//標記本層遞歸已搜索過 18 for(int i=1;i<=n;i++){ 19 if(!vis[i]){ 20 dfs(i,cnt+1,sum+G[u][i]); 21 } 22 } 23 vis[u]=false;//一次深搜完成后清除標記 24 } 25 int main() 26 { 27 cin>>n; 28 for(int i=1;i<=n;i++){ 29 for(int j=1;j<=n;j++){ 30 cin>>G[i][j]; 31 } 32 } 33 dfs(1,1,0); 34 cout<<ans<<endl; 35 return 0; 36 }
