这边很平常的最短路不同的是,它的铁路和公路要分开来算,另外注意这边它要求的是所有点都必须要有一条边,如果没有铁路的会有一条公路相连的。本来想用两次spfa来算的,然后比较取最大值就行了,后来想想只要一次就可以了。只要加个判断就好了,因为如果map[1][n]有直达的路只要算公路的就行了,如果没有直达的路的话算铁路的就行了,因为公路的肯定直达了。
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define maxn 505
#define inf 100000000
using namespace std;
int n, m;
int dis[maxn], map[maxn][maxn];
bool vis[maxn];
void spfa()
{
for (int i = 1; i <= n; i++)
dis[i] = inf;
dis[1] = 0;
vis[1] = 1;
queue<int> q;
q.push(1);
while (!q.empty())
{
int tmp = q.front();
q.pop();
vis[tmp] = 0;
for (int i = 1; i <= n; i++)
{
if (tmp == i)
continue;
if (map[tmp][i])
{
if (dis[i] > dis[tmp] + 1)
{
dis[i] = dis[tmp] + 1;
if (!vis[i])
{
vis[i] = 1;
q.push(i);
}
}
}
}
}
}
int main()
{
cin >> n >> m;
int x, y;
for (int i = 1; i <= m; i++)
{
cin >> x >> y;
map[x][y] = map[y][x] = 1;
}
if (map[1][n] == 1)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j)
continue;
map[i][j] = 1 - map[i][j];
}
}
}
spfa();
if (dis[n] == inf)
cout << "-1" << endl;
else
cout << dis[n] << endl;
return 0;
}