hdu2544(最短路径问题)

跟前面一题一模一样,稍微改了点代码,直接一次AC

 1 #include <cstring>
 2 #include <stdio.h>
 3 #define Max 0x7f7f7f7f
 4 using namespace std;
 5 int map[205][205];
 6 int dis[205],visited[205];
 7 int n,start,end;
 8 void  Dijkstra()
 9 {
10     dis[1]=0;
11     int pos;
12     for(int i=1;i<=n;i++)
13     {
14         int min=Max;
15         for(int j=1;j<=n;j++)
16         {
17             if(dis[j]<min && visited[j]==0)
18             {
19                 min=dis[j];
20                 pos=j;
21             }
22         }
23         if(pos==n) return;
24         visited[pos]=1;
25         for(int j=1;j<=n;j++)
26         {
27             if(map[pos][j]!=Max && visited[j]==0)
28             {
29                 if(dis[j]>map[pos][j]+dis[pos])
30                 {
31                     dis[j]=map[pos][j]+dis[pos];
32                 }
33             }
34         }
35     }
36 }
37 
38 int main()
39 {
40     int m,i,x,y,value;
41     while(scanf("%d%d",&n,&m)!=EOF)
42     {
43         if(m==0 && n==0) break;
44         memset(visited,0,sizeof(visited));
45         memset(map,Max,sizeof(map));
46         memset(dis,Max,sizeof(dis));
47         for(i=0;i<m;i++)
48         {
49             scanf("%d%d%d",&x,&y,&value);
50             if(value<map[x][y])
51             {
52                 map[x][y]=map[y][x]=value;//处理有重边的情况
53             }
54         }
55         Dijkstra();
56         if(dis[n]!=Max)
57         printf("%d\n",dis[n]);
58     }
59 
60 
61     return 0;
62 }

我还是换种方法来做吧,老这么做太单调了

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <cstring>
 4 #define Max 999999
 5 using namespace std;
 6 int map[1001][1001];
 7 int visit[1001];
 8 int n,m;
 9 int a,b,value;
10 int i,j,k,_min;
11 int len;
12 void Floyd()
13 {
14     for(k=1;k<=len;k++)
15     {
16         for(i=1;i<=len;i++)
17         {
18             for(j=1;j<=len;j++)
19             {
20                 if( map[i][j]>map[i][k]+map[k][j])
21                      map[i][j]=map[i][k]+map[k][j];
22             }
23         }
24     }
25 }
26 int main()
27 {
28 
29    while(cin>>n>>m,n+m)
30    {
31            for(i=0;i<1001;i++)
32         {
33             for(j=0;j<1001;j++)
34               map[i][j]=Max;
35         }
36        len=0;
37        for(i=0;i<m;i++)
38        {
39            scanf("%d%d%d",&a,&b,&value);
40 
41            if(map[a][b]>value) map[a][b]=map[b][a]=value;
42            if(len<a)  len=a;
43            if(len<b)  len=b;
44        }
45        memset(visit,0,sizeof(visit));
46        map[0][1]=0;
47        Floyd();
48        cout<<map[1][n]<<endl;
49    }
50    return 0;
51 }

这种方法更简单,直接三重循环就ok了

posted on 2012-08-14 10:53  矮人狙击手!  阅读(235)  评论(0编辑  收藏  举报

导航