HDOJ 2544 最短路 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2544

【code】(dijkstra):

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 #define maxn 1001
 6 int map[maxn][maxn];
 7 int dijkstra(int from,int to,int n)
 8 {
 9     int dij[maxn],i,k;
10     bool used[maxn];
11     memset(used,false,sizeof(used));
12     for(i=1;i<=n;i++)
13         dij[i]=INT_MAX;
14     dij[from]=0;
15     used[from]=true;
16     int now=from;
17     for(i=1;i<n;i++)
18     {
19         for(k=1;k<=n;k++)
20             if(map[now][k]&&dij[k]>dij[now]+map[now][k])
21                 dij[k]=dij[now]+map[now][k];
22         int min=INT_MAX;
23         for(k=1;k<=n;k++)
24             if(!used[k]&&dij[k]<min)
25                 min=dij[now=k];
26         used[now]=true;
27     }
28     return dij[to];
29 }
30 int main()
31 {
32     int n,m,a,b,c,i,l;
33     while(~scanf("%d%d",&n,&m))
34     {
35         if(n==0&&m==0)
36             break;
37         memset(map,0,sizeof(map));
38         for(i=0;i<m;i++)
39         {
40             scanf("%d%d%d",&a,&b,&c);
41             if(c<map[a][b]&&map[a][b]||!map[a][b])
42             {
43                 map[a][b]=c;
44                 map[b][a]=c;
45             }
46         }
47         l=dijkstra(1,n,n);
48         printf("%d\n",l);
49     }
50     return 0;
51 }

 

 

【code】(floyd):

 

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 #define maxn 1001
 6 int map[maxn][maxn];
 7 int main()
 8 {
 9     int n,m,a,b,c,i,j,k;
10     while(~scanf("%d%d",&n,&m))
11     {
12         if(n==0&&m==0)
13             break;
14         for(i=1;i<=n;i++)
15             for(j=1;j<=n;j++)
16                 map[i][j]=9999999;
17         for(i=0;i<m;i++)
18         {
19             scanf("%d%d%d",&a,&b,&c);
20             if(c<map[a][b])
21             {
22                 map[a][b]=c;
23                 map[b][a]=c;
24             }
25         }
26         for(k=1;k<=n;k++)
27             for(i=1;i<=n;i++)
28                 for(j=1;j<=n;j++)
29                     if(map[i][k]+map[k][j]<map[i][j])
30                         map[i][j]=map[i][k]+map[k][j];
31         printf("%d\n",map[1][n]);
32     }
33     return 0;
34 }

 

posted on 2012-07-14 17:16  pony1993  阅读(183)  评论(0编辑  收藏  举报

View My Stats