深度搜尋的應用 環路最小路徑

2021-07-04 05:32:23 字數 2484 閱讀 6880

環路最小路徑問題:就是熟稱的旅行者問題,也叫tsp演算法。

假設有五個城市a,b,c,d,e。如果旅行者從a城市出發,歷經其它各個城市,最終又回到a城市,且其中每個城市只能經過一次。求環路中最短的路徑就是所謂的旅行者問題。我們依舊可以採取dfs的演算法解決該問題。

本題的思路是利用深度搜尋進行窮舉,把所有的路徑都走一次,找到乙個最短的路徑。當然中途可以剪支。

要求輸入,例如:

5         

9 9 2 9 5

6 3 5 1 5

1 8 3 3 3

6 0 9 6 8

6 6 9 4 8

第一行表示一共有5個城市,其實形成乙個5×5的鄰接矩陣

後面的2~6行表示每個城市和每個城市的距離,可以理解為有向帶權圖,其中0表示從i城市出發到第j城市是走不通的,即不存在連通性

要求輸出:最小的距離,例如: 18

**部分:

#include

using namespace std;

int answer;

int n;

int array[12][12];

int visit[12];

int result;

//深度搜尋

void dfs(int node)

dfs(i);}}

int j;

for (j = 0; j < n; ++j)

isallvisit = true;

}//如果所有的通路都被走過了,而且從最後乙個節點回到0節點是有通路的,就算出此時的最小距離

if (true == isallvisit && array[node][0])

}//還原走過的節點,為別的還可能存在的路徑做準備

visit[node] = 0;

}int main(int argc, char** argv)

visit[i] = 0;

}//初始化最短距離和最終的結果,假定result開始之前是無窮大,我們用0x7fffff表示

answer = 0;

result = 0x7fffff;

dfs(0);

cout << result << endl;

return 0;

}最後同樣給出幾組測試資料:

5         

9 9 2 9 5

6 3 5 1 5

1 8 3 3 3

6 0 9 6 8

6 6 9 4 8

1 2 5 3 1 2 2 3 1 1

2 3 5 4 3 6 3 1 3 2

4 1 3 2 7 4 2 7 2 1

3 6 4 4 3 6 6 6 6 1

3 6 5 2 3 1 3 3 2 1

4 4 4 5 3 5 6 2 7 2

3 5 2 1 4 4 7 5 7 4

1 1 6 1 3 4 6 7 5 2

1 4 5 1 7 5 5 5 2 1

2 4 2 1 1 2 2 3 4 2

0 6 2 8 8 5 8 7 4

9 0 4 3 2 0 5 8 3

4 4 0 1 0 4 5 3 2

4 9 7 0 0 3 8 9 6

8 6 1 5 0 9 3 6 2

7 1 5 4 9 0 6 4 1

0 8 6 5 3 9 0 6 2

5 9 8 2 0 9 3 0 9

9 0 3 2 1 0 3 5 0

0 29 61 43 43 2 67 22 2 19

29 0 7 9 69 63 70 66 37 26

61 7 0 71 8 49 65 57 91 5

43 9 71 0 39 16 13 38 36 69

43 69 8 39 0 61 66 83 27 10

2 63 49 16 61 0 49 38 97 24

67 70 65 13 66 49 0 19 55 21

22 66 57 38 83 38 19 0 49 48

2 37 91 36 27 97 55 49 0 31

19 26 5 69 10 24 21 48 31 0

0 39 55 41 71 92 43 10 95 73

39 0 20 22 75 25 92 12 14 89

55 20 0 91 47 34 21 24 21 4

41 22 91 0 12 45 44 36 45 86

71 75 47 12 0 48 29 19 22 10

92 25 34 45 48 0 34 17 55 14

43 92 21 44 29 34 0 20 36 48

10 12 24 36 19 17 20 0 75 67

95 14 21 45 22 55 36 75 0 96

73 89 4 86 10 14 48 67 96 0

結果分別為:

18 15 23 132 183

矩陣的最小路徑和

準備校招的!這些是一本書的筆記 程式設計師 面試指南 it名企演算法與資料結構題目最優解 左程雲 給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和 舉例 如果給定的m如下 135 9 813 4 506 1 8...

矩陣的最小路徑和

給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。方法一 遞迴 coding utf 8 defsolution m,l n l m 0 0 if len m 1 and len m 0 1 return l ...

矩陣的最小路徑和

題目 給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後達到右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。舉例 給定的m如下 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12。...