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了