单源最短路径

来源:互联网 发布:华为端口聚合配置 编辑:程序博客网 时间:2024/06/12 18:59
#include <iostream>using namespace std;const static int MAX = 100;const static int INFIT = 1000;const static int WHITE = 0;const static int GRAY = 1;const static int BLACK = 2;//用来表示图规模int graph[MAX][MAX];int n;void dijkstra() {    int minv;    int d[MAX];    int color[MAX];    int u;    for(int i=0; i<n; i++) {        d[i] = INFIT;        color[i] = WHITE;    }    d[0] = 0;    color[0] = GRAY;    //找到当前最小点    while(1) {        minv = INFIT;        u = -1;        for(int i=0; i<n; i++) {            if(color[i] != BLACK && d[i] < minv ){                minv = d[i];                u = i;            }        }        //点孤立或点循环完        if(u==-1) break;        color[u] = BLACK;        //更新周围点        for(int i=0; i<n; i++) {            if(color[i] != BLACK) {                if(d[i] > d[u] + graph[u][i]) {                    d[i] = d[u] + graph[u][i];                    color[i] = GRAY;                }            }        }    }    for(int i=0; i<n; i++) {        printf("%d %d\n", i, (d[i] == INFIT)? -1 :d[i]);    }}int main() {    cin >> n;    for(int i=0; i<n; i++) {        for(int j=0; j<n; j++) {            graph[i][j] = INFIT;        }    }    int n1, n2, n3, n4;    for(int i=0; i<n; i++) {        cin >> n1 >> n2;        for(int i=0; i<n2; i++) {            cin >> n3 >> n4;            graph[n1][n3] = n4;        }    }    dijkstra();    return 0;}
0 0