HDOJ 2544

最短路

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

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
 
floyed 算法:
9847825 2013-12-17 19:13:16 Accepted 2544 15MS 296K 759 B C++ 泽泽
 
 1 #include <stdio.h>
 2 #include<string.h>
 3 int g[101][101];
 4 #define inf 0xfffff;
 5 void floyed(int n)
 6 {
 7     int i,j,k;
 8     for(k=1;k<=n;k++)
 9     {
10         for(i=1;i<=n;i++)
11         {
12             for(j=1;j<=n;j++)
13             {
14                 if(g[i][k]+g[k][j]<g[i][j])
15                     g[i][j]=g[i][k]+g[k][j];
16             }
17         }
18     }
19 }
20 int main()
21 {
22     int n,m,a,b,x,i,j;
23     while(scanf("%d %d",&n,&m)!=EOF)
24     {
25         if(!n&&!m)break;
26         for(i=1;i<=n;i++)
27         {
28             for(j=1;j<=n;j++)
29             {
30                 if(i==j)
31                     g[i][j]=0;
32                 else
33                 g[i][j]=inf;
34             }
35         }
36         for(i=1;i<=m;i++)
37         {
38             scanf("%d %d %d",&a,&b,&x);
39             if(g[a][b]>x)
40               g[a][b]=g[b][a]=x;
41         }
42         //prim(n);
43         floyed(n);
44         printf("%d\n",g[1][n]);
45     }
46     return 0;
47 }
View Code

 

dijkstra最简单算法运用:
 1 #include <stdio.h>
 2 #include<string.h>
 3 int g[101][101];
 4 #define inf 0xfffff;
 5 void prim(int n)
 6 {
 7     int lowcost[101],used[101],i,j,k;
 8     memset(used,0,sizeof(used));
 9     memset(lowcost,0,sizeof(lowcost));
10     for(i=1;i<=n;i++)
11         lowcost[i]=g[i][1];
12     used[1]=1;
13     for(i=1;i<n;i++)
14     {
15         int min=inf;
16         j=1;
17         for(k=2;k<=n;k++)
18             if(lowcost[k]<min&&!used[k])
19                 min=lowcost[k],j=k;
20         used[j]=1;
21         for(k=2;k<=n;k++)
22         {
23             if(lowcost[j]+g[k][j]<lowcost[k]&&!used[k])
24                 lowcost[k]=lowcost[j]+g[k][j],
25                 g[k][1]=g[1][k]=lowcost[k];
26         }
27     }
28 
29 }
30 int main()
31 {
32     int n,m,a,b,x,i,j;
33     while(scanf("%d %d",&n,&m)!=EOF)
34     {
35         if(!n&&!m)break;
36         for(i=1;i<=n;i++)
37         {
38             for(j=1;j<=n;j++)
39             {
40                 if(i==j)
41                     g[i][j]=0;
42                 else
43                 g[i][j]=inf;
44             }
45         }
46         for(i=1;i<=m;i++)
47         {
48             scanf("%d %d %d",&a,&b,&x);
49             if(g[a][b]>x)
50               g[a][b]=g[b][a]=x;
51         }
52         prim(n);
53         printf("%d\n",g[1][n]);
54     }
55     return 0;
56 }
View Code

 

9847784 2013-12-17 19:08:40 Accepted 2544 15MS 300K 941 B C++ 泽泽
posted @ 2013-12-17 19:10  陈泽泽  阅读(317)  评论(0编辑  收藏  举报