HDU1874(最短路)

解题思路:题意很明确,就是求起点到终点的最短路,如果存在则输出该距离,否则输出 "-1"。求单源点的最短路径问题,我选用迪杰斯特拉算法,以前用过,所以比较熟悉。可这道题需要注意的地方很多,比如在输入时两个城镇之间可以有多条路,所以必须选择最短的一条;另外,在初始化时,城镇到自身的距离应该0,开始我一直初始化为最大值,在这里栽了很大跟头。以后会注意的。
View Code
 1 #include<iostream>
 2 using namespace std;
 3 #define MAX 0xfffffff
 4 #define max 205
 5 int map[max][max],sign[max];
 6 
 7 int main()
 8 {
 9     int n,m,i,j,a,b,d;
10     while(cin>>n>>m)
11     {
12         for(i=0;i<n;i++)
13         {
14             sign[i]=0;
15             for(j=0;j<n;j++)
16             {
17                 if(i==j) map[i][j]=0//注意
18                 else map[i][j]=MAX;
19             }
20         }
21         while(m--)
22         {
23             cin>>a>>b>>d;
24             if(map[a][b]>d) map[a][b]=map[b][a]=d; //注意
25         }
26         cin>>a>>b;
27         int min,u;
28         sign[a]=1;
29         for(i=0;i<n;i++)
30         {
31             min=MAX;
32             for(j=0;j<n;j++)
33                 if(!sign[j]&&min>map[a][j])
34                 {
35                     min=map[a][j];
36                     u=j;
37                 }
38                 sign[u]=1;
39                 for(j=0;j<n;j++)
40                     if(!sign[j]&&min+map[u][j]<map[a][j])
41                         map[a][j]=min+map[u][j];
42         }
43         if(map[a][b]<MAX)    cout<<map[a][b]<<endl;
44         else  cout<<"-1"<<endl;
45     }
46     return 0;
47 }
posted @ 2012-02-18 10:38  笑巧  阅读(937)  评论(2编辑  收藏  举报