HDU 1874 畅通工程续 dijkstra

题意就是求S->T的最短路径,需要注意的是,这题会有重复输入的边,

比如:先输入 1 2 3  又输入 1 2 4,那么1和2之间最短的路径应该是3而不是后面输入的4

#include <iostream>
#include <algorithm>
#define N 220
#define INF 0x3f3f3f3f
using namespace std;
int map[N][N],n,m;
int dijkstra(int s,int d)
{
    int i,j,vis[N]= {0},dis[N];
    for(i=0; i<N; i++)
        dis[i]=INF;
    for(i=0; i<n; i++)
        dis[i]=map[s][i];
    vis[s]=1;
    for(i=1; i<n; i++)
    {
        int k=-1,min=INF;
        for(j=0; j<n; j++)
            if(!vis[j]&&dis[j]<min)
            {
                min=dis[j];
                k=j;
            }
        if(k==-1)
            continue;
        vis[k]=1;
        for(j=0; j<n; j++)
            if(!vis[j]&&dis[j]>dis[k]+map[k][j])
                dis[j]=dis[k]+map[k][j];
    }
    if(dis[d]==INF)
        return -1;/*不可达*/
    return dis[d];
}
int main()
{
    int i;
    while(cin>>n>>m)
    {
        for(i=0; i<=n; i++)
            for(int j=0; j<=n; j++)
            {
                if(i==j)
                    map[i][j]=0;
                else
                    map[i][j]=INF;
            }
        for(i=0; i<m; i++)
        {
            int x,y,z;
            cin>>x>>y>>z;
            if(map[x][y]!=INF)/*判断是否重复输入*/
                z=z<map[x][y]?z:map[x][y];
            map[x][y]=map[y][x]=z;
        }
        int s,d;
        cin>>s>>d;
        cout<<dijkstra(s,d)<<endl;
    }
    return 0;
}

 

posted @ 2016-04-20 08:30  byonlym  阅读(136)  评论(0)    收藏  举报