旅行商問題(深度優先搜索)


輸入:一個整數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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM