HDU1874 畅通工程续(最短路)

题目链接

分析:

本题只要考虑重边的问题,基本上就没其它问题了。

#include <stdio.h>

#define MAXN 202

const int INF = (1<<26);

int dis[MAXN], G[MAXN][MAXN], vis[MAXN];

void Init(int n){
    int i, j;
    for(i=0; i<n; i++){
        vis[i] = 0;
    }
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            G[i][j] = INF;
        }
    }
}

void dijkstra(int v0, int n){
    int i, j;
    for(i=0; i<n; i++){
        dis[i] = G[v0][i];
    }

    vis[v0] = 1;
    dis[v0] = 0;
    for(i=0; i<n; i++){
        int x, m = INF;
        for(j=0; j<n; j++) if(!vis[j] && m > dis[j]) m = dis[x=j];
        vis[x] = 1;
        for(j=0; j<n; j++) if(!vis[j] && dis[j] > dis[x] + G[x][j]){
            dis[j] = dis[x]+G[x][j];
        }
    }
}

int main(){
    int n, m, i, u, v, w, S, T;

    while(scanf("%d %d", &n, &m) == 2){
        Init(n);

        for(i=0; i<m; i++){
            scanf("%d %d %d", &u, &v, &w);
            if(G[u][v] > w){
                G[u][v] = G[v][u] = w;
            }
        }

        scanf("%d %d", &S, &T);

        dijkstra(S, n);

        if(dis[T] != INF) printf("%d\n", dis[T]);
        else printf("-1\n");
    }

    return 0;
}

 

posted on 2013-02-27 19:53  Still_Raining  阅读(187)  评论(0)    收藏  举报