HDU-2544 最短路(Dijkstra算法求无向图最短路模板题)

来源:互联网 发布:什么叫大数据思维 编辑:程序博客网 时间:2024/04/30 03:38

最短路

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 57379 Accepted Submission(s): 25280

Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0

Sample Output
3
2

题意:
单纯的不能再单纯的无向图求最短路问题

代码:

/*************************************************************************    > File Name: HDU2544.cpp    > Author: SIU    > Created Time: 2016年11月28日 星期一 16时29分46秒 ************************************************************************/#include<cstdio>#include<iostream>#include<cstring>using namespace std;struct Edge{    int to;    int next;    int w;};int cnt=0;Edge edge[10050];int Head[10050];int visit[10050];int que[10050];int dis[10050];void add(int u,int v,int w){    edge[cnt].to=v;    edge[cnt].next=Head[u];    edge[cnt].w=w;    Head[u]=cnt++;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0&&m==0)            break;        memset(Head,-1,sizeof(Head));        memset(visit,0,sizeof(visit));        memset(dis,0,sizeof(visit));        memset(que,0,sizeof(que));        cnt=0;        for(int i=1;i<=m;i++)        {            int iu,iv,iw;            scanf("%d%d%d",&iu,&iv,&iw);            add(iu,iv,iw);            add(iv,iu,iw);        }        int head=1;        int tail=1;        que[tail]=1;        visit[1]=1;        dis[1]=0;        tail++;        while(head<tail)        {            for(int i=Head[que[head]];i!=-1;i=edge[i].next)            {                if(visit[edge[i].to]==0)                {                    que[tail]=edge[i].to;                    dis[edge[i].to]=dis[que[head]]+edge[i].w;                    tail++;                    visit[edge[i].to]=1;                }                else                {                    if(dis[que[head]]+edge[i].w>=dis[edge[i].to])                        continue;                    else                    {                        que[tail]=edge[i].to;                        dis[edge[i].to]=dis[que[head]]+edge[i].w;                        tail++;                    }                }            }            head++;        }        printf("%d\n",dis[n]);    }    return 0;}
0 0
原创粉丝点击