题解: 处理好每站的联系,把他们储存到图中是解题的关键. 之后就是简单的Dijkstra算法 求最短路...
1 #include <stdio.h>
2 #include <string.h>
3 #include <math.h>
4 #include <limits.h>
5 #include <algorithm>
6 #include <iostream>
7 #include <ctype.h>
8 #include <iomanip>
9 #include <queue>
10 #include <stdlib.h>
11 using namespace std;
12
13 #define INF 0xffffff
14 #define N 550
15 int m,n;
16 int map[N][N];
17
18 void Dijkstra()
19 {
20 int i,j,u,sum=0;
21 int book[N],dis[N],min;
22 memset(book,0,sizeof(book));//book数组初始化
23 //初始化dis数组,这里是1号顶点到其余各个顶点的初始路程
24 for(i=1;i<=n;i++)
25 dis[i]=map[1][i];
26 book[1]=1;
27
28 //Dijkstra算法核心语句
29 for(i=1;i<=n-1;i++)
30 {
31 //找到离1号顶点最近的顶点
32 min=INF;
33 for(j=1;j<=n;j++)
34 {
35 if(book[j]==0 && dis[j]<min)
36 {
37 min=dis[j];
38 u=j;
39 }
40 }
41 book[u]=1;
42 for(j=1;j<=n;j++)
43 {
44 if(map[u][j]<INF)
45 {
46 if(dis[j]>dis[u]+map[u][j])
47 dis[j]=dis[u]+map[u][j];
48 }
49 }
50 }
51 if(dis[n]>=INF)
52 printf("NO\n");
53 else
54 printf("%d\n",dis[n]-1);
55 }
56
57 int main()
58 {
59 int t;
60 scanf("%d",&t);
61 while(t--){
62 int i,j,k=0,v;
63 char s[2000];
64 int du[N];
65 scanf("%d%d",&m,&n);
66 for(i=0;i<=N;i++){
67 for(j=0;j<=N;j++){
68 if(i==j)
69 map[i][j]=0;
70 else
71 map[i][j]=INF;
72 }
73 }
74 getchar();
75 for(i=0;i<m;i++)//建图
76 {
77 k=0;
78 gets(s);
79 for(j=0;j<strlen(s);j++)
80 {
81 if(s[j]!=‘ ‘)
82 {
83 int sum=0;
84 while(s[j]!=‘ ‘&&j<strlen(s))
85 {
86 sum=sum*10+(s[j]-‘0‘);j++;//有可能是两位或更多位的数
87 }
88 du[k++]=sum;
89 }
90 }
91 for(j=0;j<k;j++)
92 {
93 for(v=j+1;v<k;v++)
94 {
95 map[du[j]][du[v]]=1;
96 }
97 }
98 }
99 Dijkstra();
100 }
101 }