1 #include <iostream>
2 #include <algorithm>
3 #include <cstring>
4 //两遍迪杰斯特拉
5 #define INF 0xfffffff
6 using namespace std;
7 const int maxn = 400 + 5;
8 int rail[maxn][maxn];
9 int dis[maxn];
10 int vis[maxn];
11
12 void dij(int n, int u){
13 int i, j, p, Min;
14 memset(vis, 0, sizeof(vis));
15 for (int i = 1; i <= n; i++)
16 dis[i] = rail[u][i];
17 vis[u] = 1;
18 dis[u] = 0;
19
20 for (i = 1; i < n; i++){
21 Min = INF;
22 for (j = 1; j <= n; j++){
23 if (!vis[j] && dis[j] < Min){
24 p = j;
25 Min = dis[j];
26 }
27 }
28 if (Min == INF) return;
29 vis[p] = 1;
30 for (j = 1; j <= n; j++){
31 if (!vis[j] && dis[p] + rail[p][j] < dis[j]){
32 dis[j] = dis[p] + rail[p][j];
33 }
34 }
35 }
36 }
37
38 int main(){
39 ios::sync_with_stdio(false);
40 fill(rail[0], rail[0] + maxn*maxn, INF);
41 int n, m;
42 cin >> n >> m;
43 if (m == 0){
44 //没有铁路
45 cout << "-1" << endl;
46 return 0;
47 }
48 for (int i = 0; i < m; i++){
49 int x, y;
50 cin >> x >> y;
51 rail[x][y] = 1;
52 rail[y][x] = 1;
53 }
54 dij(n, 1);
55 int ans1 = dis[n];
56 if (ans1 == INF || m == (n*(n - 1) / 2)){
57 //铁路没有答案,或者没有公路
58 cout << "-1" << endl;
59 return 0;
60 }
61
62 for (int i = 1; i <= n; i++){
63 for (int j = 1 + i; j <= n; j++){
64 if (rail[i][j] == 1){
65 rail[i][j] = INF;
66 rail[j][i] = INF;
67 }
68 else{
69 rail[i][j] = 1;
70 rail[j][i] = 1;
71 }
72 }
73 }
74 dij(n, 1);
75 int ans2 = dis[n];
76 int ans = ans1 > ans2 ? ans1 : ans2;
77 cout << ans << endl;
78
79
80 system("pause");
81 return 0;
82 }