因为每个小镇之间要么有一条铁路,要么有一条公路,所以火车和汽车不可能出现在同一个小镇上,所以求两次最短路径取最大的就行了。

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int INF=1e9+7;
int map[405][405];//map=1表示铁路,=0表示公路
int n,m;
int d[405],vis[405];
void dijkstra()
{
memset(vis,1,sizeof(vis));
memset(d,0,sizeof(d));
int i,j;
for(i=1;i<=n;i++)
d[i]=map[1][i];
d[1]=0;
vis[1]=0;
for(i=1;i<n;i++)
{
int temp,minn=INF;
for(j=1;j<=n;j++)
{
if(vis[j]&&d[j]<minn)
{
minn=d[j];
temp=j;
}
}
vis[temp]=0;
for(j=1;j<=n;j++)
if(vis[j]&&d[j]>d[temp]+map[temp][j])
d[j]=d[temp]+map[temp][j];
}
}
int main()
{
cin>>n>>m;
int i,j;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=INF;
if(m==0)
cout<<"-1"<<endl;
else
{
for(i=0;i<m;i++)
{
int s1,s2;
cin>>s1>>s2;
map[s1][s2]=map[s2][s1]=1;
}
dijkstra();
int ans1=d[n];
if(ans1==INF) cout<<"-1"<<endl;
else
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]==INF)
map[i][j]=1;
else
map[i][j]=INF;
dijkstra();
int ans2=d[n];
if(ans2==INF) cout<<"-1"<<endl;
else cout<<(max(ans1,ans2))<<endl;
}
}
return 0;
}