HDU 1548 最短路

最短路



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& lt;=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
 
 dijkstra:
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int inf=0x3f3f3f;
 7 int m,n;
 8 int gp[105][105];
 9 int d[105];
10 int vis[105];
11 
12 void dijkstra()
13 {
14     int i,j,pos,sum=0;
15     vis[1]=1;
16     for(i=2;i<=m;i++)
17     d[i]=gp[1][i];
18     for(i=2;i<=m;i++)
19     {
20         int temp=inf;
21         for(j=1;j<=m;j++)
22         {
23             if(!vis[j]&&d[j]<temp)
24             {
25                 pos=j;
26                 temp=d[j];
27             }
28         }
29         vis[pos]=1;
30         for(j=1;j<=m;j++)
31         {
32             if(d[pos]+gp[pos][j]<d[j]&&!vis[j])
33             d[j]=gp[pos][j]+d[pos];
34         }
35     }
36     printf("%d\n",d[m]);
37 }
38 
39 int main()
40 {
41     int a,b,c;
42     while(scanf("%d%d",&m,&n),m|n)
43     {
44         memset(vis,0,sizeof(vis));
45         memset(gp,inf,sizeof(gp));
46         for(int i=0;i<n;i++)
47         {
48             scanf("%d%d%d",&a,&b,&c);
49             gp[a][b]=gp[b][a]=min(c,gp[a][b]);
50         } 
51         dijkstra();
52     }
53     return 0;
54 }

 spfa:

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn=110;
 8 const int maxm=10010;
 9 const int inf=0x3f3f3f3f;
10 
11 struct edge
12 {
13     int u,v,w,next;
14 }edges[maxm];
15 
16 bool vis[maxn];
17 int head[maxm];
18 int d[maxn];
19 int cnt;
20 int m,n;
21 
22 void init()
23 {
24     memset(head,-1,sizeof(head));
25     cnt=0;
26 }
27 
28 void addedge(int u,int v,int w)
29 {
30     edges[cnt]=(edge){u,v,w,head[u]};
31     head[u]=cnt++;
32 }
33 
34 void spfa(int s)
35 {
36     queue<int>q;
37     memset(vis,0,sizeof(vis));
38     memset(d,inf,sizeof(d));
39     d[s]=0;
40     q.push(s);
41     vis[s]=1;
42     while(!q.empty())
43     {
44         int u=q.front();
45         q.pop();
46         vis[u]=0;
47         for(int i=head[u];i!=-1;i=edges[i].next)
48         {
49             edge e=edges[i];
50             if(d[e.v]>d[e.u]+e.w)
51             {
52                 d[e.v]=d[e.u]+e.w;
53                 if(!vis[e.v])
54                 {
55                     q.push(e.v);
56                     vis[e.v]=1;
57                 }
58             }
59         }
60     }
61     printf("%d\n",d[m]);
62 }
63 
64 int main()
65 {
66     int u,v,w;
67     while(scanf("%d%d",&m,&n),m|n)
68     {
69         init();
70         for(int i=0;i<n;i++)
71         {
72             scanf("%d%d%d",&u,&v,&w);
73             addedge(u,v,w);
74             addedge(v,u,w);
75         }
76         spfa(1);
77     }
78     return 0;
79 }

 

posted on 2015-08-11 16:18    阅读(319)  评论(0编辑  收藏  举报

导航