码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2544 最短路(Dijkstra Or Floyd Or dfs)

时间:2015-08-21 21:17:31      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

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

 

   Dijkstra:

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int mx=1000000;
 6 int n,m;
 7 int v[105],ans[105];
 8 int map[105][105];
 9 void f(int x)
10 {
11     v[x]=1;
12     int i,p,mn;
13     for (i=1;i<=n;i++) ans[i]=map[x][i];
14     while (1)
15     {
16         mn=mx;
17         p=x;
18         for (i=1;i<=n;i++)
19         {
20             if (!v[i]&&ans[i]<mn)
21             {
22                 p=i;
23                 mn=ans[i];
24             }
25         }
26         if (p==x) return ;
27         v[p]=1;
28         for (i=1;i<=n;i++)
29         {
30             if (!v[i]&&ans[i]>ans[p]+map[p][i])
31             ans[i]=ans[p]+map[p][i];
32         }
33     }
34 }
35 int main()
36 {
37     int i,j,a,b,c;
38     while (~scanf("%d%d",&n,&m))
39     {
40         if (n==0&&m==0) return 0;
41         for (i=1;i<=n;i++)
42         for (j=1;j<=n;j++)
43         {
44             if (i==j) map[i][j]=0;
45             else map[i][j]=mx;
46         }
47         while (m--)
48         {
49             scanf("%d%d%d",&a,&b,&c);
50             if (map[a][b]>c)
51             map[a][b]=map[b][a]=c;
52         }
53         memset(v,0,sizeof(v));
54         f(1);
55         printf("%d\n",ans[n]);
56     }
57 }

 

 Floyd:

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int main()
 6 {
 7     int n,m,i,j,k,a,b,c;
 8     int map[108][108];
 9     while (~scanf("%d%d",&n,&m))
10     {
11         if (n==0&&m==0) return 0;
12         for (i=1;i<=n;i++)
13         for (j=1;j<=n;j++) map[i][j]=10000000;
14         while (m--)
15         {
16             scanf("%d%d%d",&a,&b,&c);
17             map[a][b]=map[b][a]=c;
18         }
19         for (k=1;k<=n;k++)
20         for (i=1;i<=n;i++)
21         for (j=1;j<=n;j++)
22         if (map[i][j]>map[i][k]+map[k][j])
23         map[i][j]=map[i][k]+map[k][j];
24         printf("%d\n",map[1][n]);
25     }
26 }

 

 Dfs:

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,m,a,b,c,t;
 6 int map[108][108],v[108];
 7 void dfs(int x,int p)
 8 {
 9     if (p>t) return ;
10     if (x==n)
11     {
12         t=p;
13         return ;
14     }
15     int i;
16     for (i=2;i<=n;i++)
17     {
18         if (!v[i]&&map[x][i])
19         {
20             v[i]=1;
21             dfs(i,p+map[x][i]);
22             v[i]=0;
23         }
24     }
25 }
26 int main()
27 {
28     int i,j;
29     while (~scanf("%d%d",&n,&m))
30     {
31         if (n==0&&m==0) return 0;
32         memset(map,0,sizeof(map));
33         memset(v,0,sizeof(v));
34         while (m--)
35         {
36             scanf("%d%d%d",&a,&b,&c);
37             map[a][b]=map[b][a]=c;
38         }
39         t=1000000;
40         dfs(1,0);
41         printf("%d\n",t);
42     }
43 }

 

hdu 2544 最短路(Dijkstra Or Floyd Or dfs)

标签:

原文地址:http://www.cnblogs.com/pblr/p/4748960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!