HDOJ 1874 畅通工程续

题目
这个题目,个人认为对于真正理解dijkstra算法的人来说 不难 然自己刚开始就是理论可以但是到了具体的代码实现有一定难度 这几天也算是下定决心重温了几遍 真的是过程艰难 结果还是挺好

#include<iostream>
#include<cstdio>
#include<cstring> 
#define inf 0x3f3f3f//表示一个很大的数(0x 十六进制) 
using namespace std;
int dis[200];//用来存储当前点到源点的最短路径信息
int vis[200];//用来表示访问过的节点 0未访问过 1访问过 
int map[200][200];//用来存储两点之间的距离长度
int N,M;
void initialise()
{ 
    int i,j;
    memset(vis,0,sizeof(vis));//初始化vis为0 都未访问过 
    memset(dis,inf,sizeof(dis));//初始化dis为最大值  
    for(i=0;i<N;i++)
    { 
        for(j=0;j<N;j++)
        {//当i等于j表示从节点a到节点a 显然为0(即从这个城镇到这个城镇不用行走) 
            if(i==j) map[i][j]=0;
            else map[i][j]=inf;
        }   
    } 
}
void dijkstra(int v)
{
    int i,j,u,tmp; 
    for(i=0;i<N;i++)
        dis[i]=map[v][i];
    dis[v]=0;
    vis[v]=1;
    for(i=0;i<N;i++)
    {
        u=v;
        tmp=inf;
        for(j=0;j<N;j++)
        {
            if(!vis[j]&&dis[j]<=tmp)
            {
                u=j;
                tmp=dis[j];
            }
        }
        vis[u]=1;//表示已访问
        for(j=0;j<N;j++)
        {//更新dis 使其存储当前源点的最短路径 
            if(!vis[j]&&map[u][j]<inf)
            {
                int newdis=dis[u]+map[u][j];
                if(newdis<dis[j])
                    dis[j]=newdis;
            }
        } 
    } 
}
int main()
{
    int i,a,b,x,start,end,j;
    while(scanf("%d %d",&N,&M)!=EOF)
    {initialise();
        for(i=0;i<M;i++)
        {
            scanf("%d %d %d",&a,&b,&x);
            if(x<map[a][b])
            {//路可以从a到b也可b到a 所以应该是无向图 
                map[a][b]=x;
                map[b][a]=x;
            }
        }
        scanf("%d %d",&start,&end);
        dijkstra(start);
        if(dis[end]==inf) cout<<"-1"<<endl;
        else cout<<dis[end]<<endl;
    }   
    return 0;
} 

加油

猜你喜欢

转载自blog.csdn.net/thwwu/article/details/79320552