HDU - 1874 畅通工程续(Dijkstra)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874

#include <iostream>
#include <string.h>
#define N 205
#define MAX 100000005
using namespace std;
/****************************************************************************************************************
                    题意:dijkstra
                    思路:
                    1,注意不在起终点之间没有路径到大的判断条件
                    2,在注释中已给出,用dist 不能用 map[i][j]
****************************************************************************************************************/
int map[N][N];
int dist[N];
int visit[N];       //访问标志,用来判断点是否在特殊路径的集合内
int dijkstra(int st,int n)
{
    memset(dist,MAX,sizeof(dist));
    memset(visit,0,sizeof(visit));
    for(int i = 0;i < n;i ++)       //初始化特殊路径长度
        dist[i]=map[st][i];

    dist[st]=0;     //自己到自己长度为0
    visit[st]=1;

    for(int i = 1;i <= n;i ++){
        int id,ans=MAX;
        for(int j = 0;j < n;j ++){
            if(!visit[j] && dist[j] < ans){     //非特殊路径最小值
                ans=dist[j];
                id=j;
            }
        }
        visit[id]=1;
        for(int j = 0;j < n;j ++)
            if(!visit[j] && dist[id]+map[id][j] < dist[j])
                dist[j]=dist[id]+map[id][j];        //最优存在于 非特殊路径最小点到当前点 or st直接到 j 的距离
    }
}
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        for(int i = 0;i < n;i ++)
            for(int j = 0;j < n;j ++)
                map[i][j]=MAX;
        int a,b,le;
        for(int i = 0;i < m;i ++){
            cin>>a>>b>>le;
            if(le < map[a][b])
                map[a][b]=map[b][a]=le;     //无向图,双向赋最小值
        }
        int st,ed;
        cin>>st>>ed;

        dijkstra(st,n);

        if(dist[ed] != MAX)     //这里wa了,不知道为什么用 map[st][ed] != MAX 不能表示 st-ed没有路径
            cout<<dist[ed]<<endl;
        else
            cout<<"-1"<<endl;
    }
    return 0;
}



 

posted on 2016-04-30 18:30  Jstyle  阅读(103)  评论(0编辑  收藏  举报

导航