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 }
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 }