# 1649 齐头并进

Input
单组测试数据。

Output
输出一个整数，表示答案，如果没有合法的路线规划，输出-1。
Input示例
4 2
1 3
3 4
Output示例
2

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
const int N = 500;
const int INF = 999;
int a[N][N];
bool vis[N];
int dis[N];

void dijkstra(int n) {
for(int i=1; i<=n; i++) {
if(i == 1) {
vis[i] = 1;
dis[i] = INF;
}
else {
if(a[1][i] == 1)
dis[i] = a[1][i];
else
dis[i] = INF;
}
}

for(int i=2; i<=n; i++) {

int Min = INF, Minj = 1;
for(int j=1; j<=n; j++) {
if(!vis[j] && dis[j] < Min) {
Min = dis[j];
Minj = j;
}
}

if(Minj == -1){
break;
}
vis[Minj] = 1;
dis[Minj] = Min;

for(int k=1; k<=n; k++) {
if(vis[k])
continue;
if(a[Minj][k]>0 && Min+a[Minj][k] < dis[k]) {
dis[k] = Min+a[Minj][k];
}

}
}
}

int main()
{
int n, m;
cin >> n >> m;

memset(a, 0, sizeof(a));
memset(vis, 0, sizeof(vis));

int x, y;
for(int i=1; i<=m; i++) {
cin >> x >> y;
a[x][y] = a[y][x] = 1;
}

if(a[1][n] == 1) {
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(i == j)
a[i][j] = 0;
else if(a[i][j] == 0)
a[i][j] = 1;
else
a[i][j] = 0;
}
}
}
dijkstra(n);

if(dis[n] == INF)
cout << "-1" << endl;
else
cout << dis[n] << endl;
return 0;
}