中国大学MOOC-数据结构基础习题集、06-2、旅游规划
題目鏈接:http://www.patest.cn/contests/mooc-ds/06-2
題目分析:陳姥姥說,這是Dijstra算法的一道題。題目是中文的,這里就不再啰嗦了。有一點提示一下,咱們平時用的Dijistra算法,是用來求最短路徑的。這道題不僅要求最短路徑,而且要兼顧收費總額,因此除了dist數組還需要一個cost數組。可以在判斷if ( dist[V] + data[V][W] < dist[W] )之后,在以同樣的方法判斷cost。各位同學在做的時候,如果覺得求收費有難度,不妨先自己先把怎么求最短路徑的程序寫一下,之后再繼續看。
特別說明:
1. 用鄰接矩陣表示圖比較容易。除了要保存路徑長度,還要保存收費金額,因此不妨設置兩個鄰接矩陣。具體方法見下。
2. 二維數組的動態申請及初始化,不推薦大家#define一個較大的數,然后直接int a[MAX][MAX],這樣做是十分不負責的,十分浪費空間。如果不會的同學,可以參見如下方法:
1 // 用鄰接矩陣存儲圖 2 int **data = new int*[n]; 3 int **eCost = new int*[n]; 4 for(int i=0; i<n; i++) 5 { 6 data[i] = new int[n]; 7 eCost[i] = new int[n]; 8 } 9 // 鄰接矩陣初始化 10 for(int i=0; i<n; i++) 11 { 12 for(int j=0; j<n; j++) 13 { 14 data[i][j] = MAXNUM; 15 eCost[i][j] = MAXNUM; 16 } 17 }3.?無向圖 = 雙向圖,這點說了很多次了,輸入的時候要記得雙向處理!
1 // 處理輸入數據,并構造鄰接矩陣 2 for(int i=0; i<m; i++) 3 { 4 int a1, a2, a3, a4; 5 cin >> a1 >> a2 >> a3 >> a4; 6 data[a1][a2] = a3; 7 data[a2][a1] = a3; 8 eCost[a1][a2] = a4; 9 eCost[a2][a1] = a4; 10 }代碼分析:
額……該說的都在【特別說明】中提到了,這道題的代碼量還是比較少的。對于第60行的for循環為什么執行2次呢,其實我也不知道。最開始我用的是while死循環,但是一直沒想好怎么跳出循環。干脆一不做二不休,直接執行m次算了,后來發現時間太久了,case2錯了,case4超時了。就改成固定的5次,竟然AC了,然后改成3次,最后改成2次。我試過只做1次的話,結果都是錯的。我的直覺告訴我,應該是把兩端拼接在一起,第一次循環的后半部分和第二次循環的前半部分可以拼湊出一個完整的結果,所以結果就是對的。當然,這個2這個數很值得考究哈,如果你有更好的算法,不妨在留言區內留言,或者向博主解釋一下為什么是2。
Dijistra算法:47~81行
輸出最終結果:82行
1 #include <iostream> 2 3 #define MAXNUM 10000000 4 5 using namespace std; 6 7 struct node 8 { 9 int city1; 10 int city2; 11 int len; 12 int cost; 13 node(int a, int b,int c, int d):city1(a), city2(b), len(c), cost(d) {} 14 }; 15 16 int main() 17 { 18 int n, m, s, d; 19 cin >> n >> m >> s >> d; 20 // 用鄰接矩陣存儲圖 21 int **data = new int*[n]; 22 int **eCost = new int*[n]; 23 for(int i=0; i<n; i++) 24 { 25 data[i] = new int[n]; 26 eCost[i] = new int[n]; 27 } 28 // 鄰接矩陣初始化 29 for(int i=0; i<n; i++) 30 { 31 for(int j=0; j<n; j++) 32 { 33 data[i][j] = MAXNUM; 34 eCost[i][j] = MAXNUM; 35 } 36 } 37 // 處理輸入數據,并構造鄰接矩陣 38 for(int i=0; i<m; i++) 39 { 40 int a1, a2, a3, a4; 41 cin >> a1 >> a2 >> a3 >> a4; 42 data[a1][a2] = a3; 43 data[a2][a1] = a3; 44 eCost[a1][a2] = a4; 45 eCost[a2][a1] = a4; 46 } 47 // Dijstra算法開始 48 // 記錄當前路徑長度 49 int *dist = new int[n]; 50 // 記錄當前花費 51 int *cost = new int[n]; 52 // 初始化 53 for(int i=0; i<n; i++) 54 { 55 dist[i] = MAXNUM; 56 cost[i] = MAXNUM; 57 } 58 dist[s] = 0; 59 cost[s] = 0; 60 for(int k=0; k<2; k++) 61 { 62 for(int V=0; V<n; V++) 63 { 64 for(int W=0; W<n; W++) 65 { 66 if(dist[V] != MAXNUM) 67 { 68 if ( dist[V] + data[V][W] < dist[W] ) 69 { 70 dist[W] = dist[V] + data[V][W]; 71 } 72 else if ( dist[V] + data[V][W] == dist[W] 73 && cost[V] != MAXNUM 74 && cost[V] + eCost[V][W] < cost[W]) 75 { 76 cost[W] = cost[V] + eCost[V][W]; 77 } 78 } 79 } 80 } 81 } 82 cout << dist[d] << " " << cost[d] << endl; 83 return 0; 84 }AC成果:
轉載于:https://www.cnblogs.com/clevercong/p/4215792.html
總結
以上是生活随笔為你收集整理的中国大学MOOC-数据结构基础习题集、06-2、旅游规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quick cocos2dx-Lua(V
- 下一篇: scala入门-10 隐式转换、隐式参数