51nod1649
题解:这一题看起来很难,其实稍微思考一下会发现就是一次Dijkstra。
如果1和n之间无铁路,那么就一定有公路,那么汽车就一步到达,只需求火车的最短路。
如果存在铁路,那么火车一步到达,只需求汽车的最短路。
代码:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int const N = 400 + 10;
int const inf = 0x7f7f7f7f;
int n,m,mp[N][N],d[N],vis[N];
int Dijkstra(int s){
for(int i=1;i<=n;i++) d[i] = mp[s][i];
d[s] = 0;
for(int i=1;i<=n;i++){
int MIN = inf,u;
for(int j=1;j<=n;j++)
if(!vis[j] && d[j] < MIN) MIN = d[j], u = j;
vis[u] = true;
for(int j=1;j<=n;j++)
if(mp[u][j] != inf && d[u] + mp[u][j] < d[j])
d[j] = d[u] + mp[u][j];
}
return d[n] == inf ? -1 : d[n];
}
int main() {
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
mp[y][x] = mp[x][y] = 1; //表示x和y之间修建了铁轨
}
if(mp[1][n]){ //火车一步到达,求汽车最短路
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i == j) mp[i][j] = 0;
else mp[i][j] = mp[i][j] ? inf : 1;
}else{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i == j) mp[i][j] = 0;
else mp[i][j] = mp[i][j] ? 1 : inf;
}
printf("%d\n",Dijkstra(1));
return 0;
}