/* Problem Description 在每年的校賽裏,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎? Input 輸入包括多組數據。每組數據第一行是兩個整數N、M(N<=100,M<=10000),N表示成都的大街上有幾個路口,標號爲1的路口是商店所在地,標號爲N的路口是賽場所在地,M則表示在成都有幾條路。N=M=0表示輸入結束。接下來M行,每行包括3個整數A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A與路口B之間有一條路,我們的工作人員需要C分鐘的時間走過這條路。 輸入保證至少存在1條商店到賽場的路線。 Output 對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間 Sample Input 2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0 Sample Output 3 2 */ #include<iostream> #include<cstring> using namespace std; #define INF 1000000 bool visited[205]; int weight[205]; int matrix[205][205]; int target,road; void dij(int len) { memset(visited, false, sizeof(visited)); for (int i = 1; i <= len; ++i) { weight[i] = matrix[1][i]; } visited[1] = true; weight[1] = 0; while(true) { int _min = INF, next_node = -1; for (int i = 1; i <= len; ++i) { if (!visited[i] && weight[i] < _min) { _min = weight[i]; next_node = i; } } if (next_node == -1) { break; } visited[next_node] = true; for (int i = 1; i <= len; ++i) { if (!visited[i] && weight[i] > weight[next_node] + matrix[next_node][i]) { weight[i] = weight[next_node] + matrix[next_node][i]; } } } cout << weight[len] << endl; } int main() { int x, y, z; while (cin >> target >> road) { if (target == 0 || road == 0) break; memset(matrix, INF, sizeof(matrix)); for (int i = 1; i <= road; i++) { cin >> x >> y >> z; if (matrix[x][y] > z || matrix[y][x] > z) { matrix[x][y] = z; matrix[y][x] = z; } } dij(target); } return 0; }
dijstra
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.