最短路

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 }

 

你可能感兴趣的:(最短路)