dijstra

/*
Problem Description
在每年的校賽裏,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?

Input
輸入包括多組數據。每組數據第一行是兩個整數NMN<=100M<=10000),N表示成都的大街上有幾個路口,標號爲1的路口是商店所在地,標號爲N的路口是賽場所在地,M則表示在成都有幾條路。N=M=0表示輸入結束。接下來M行,每行包括3個整數ABC1<=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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章