hdoj 2544 最短路
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=2544
分析:Dijkstra算法
1 //2013-10-30 10:01:25 Accepted 2544 15MS 340K 1824 B C++ 空信高手 2 #include <iostream> 3 using namespace std; 4 5 /*==================================================*\ 6 | Dijkstra 数组实现O (N^2 ) 7 | Dijkstra --- 数组实现( 在此基础上可直接改为STL 的Queue实现) 8 | lowcost[] --- beg 到其他点的最近距离 9 | path[] -- beg为根展开的树,记录父亲结点 10 \*==================================================*/ 11 #define INF 0x3F3F3F3F; 12 const int N=110; 13 int path[N],vis[N]; 14 int cost[N][N]; 15 void Dijkstra(int lowcost[N],int n,int beg) 16 { 17 int i,j,min; 18 memset(vis,0,sizeof(vis)); 19 vis[beg]=1; 20 for(i=0; i<n; i++) 21 { 22 lowcost[i]=cost[beg][i]; 23 path[i]=beg; 24 } 25 lowcost[beg]=0; 26 path[beg]=-1; 27 int pre=beg; 28 for(i=1; i<n; i++) 29 { 30 min=INF; 31 for(j=0; j<n; j++) 32 //下面的加法可能导致溢出,INF不能取太大 33 if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j]) 34 { 35 lowcost[j]=lowcost[pre]+cost[pre][j]; 36 path[j]=pre; 37 } 38 for(j=0; j<n; j++) 39 if(vis[j]==0&&lowcost[j]<min) 40 { 41 min=lowcost[j]; 42 pre=j; 43 } 44 vis[pre]=1; 45 } 46 } 47 void Init() 48 { 49 int i,j; 50 for(i=0; i<N; i++) 51 for(j=0; j<N; j++) 52 cost[i][j]=INF; 53 } 54 55 int main() 56 { 57 // freopen("input.txt","r",stdin); 58 int n,m,i,a,b,dis; 59 while(cin>>n>>m&&!(n==0&&m==0)) 60 { 61 Init(); 62 int lowcost[N]; 63 for(i=0; i<m; i++) 64 { 65 cin>>a>>b>>dis; 66 if(cost[a-1][b-1]>dis) 67 cost[a-1][b-1]=cost[b-1][a-1]=dis; 68 } 69 Dijkstra(lowcost,n,0); 70 cout<<lowcost[n-1]<<endl; 71 // if( lowcost[n-1] < 0x3F3F3F3F ) cout<<lowcost[n-1]<<endl; 72 // else cout<<"-1"<<endl; 73 } 74 return 1; 75 }