看数据范围,然后果断邻接矩阵$Floyd$啊
对于公路和铁路,各建一个图,分别跑最短路,然后取最大值即可
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,e[][],len[][][];
int main()
{
scanf("%d%d",&n,&m);
memset(len,0x3f,sizeof(len));
for(int x,y,i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
e[x][y]=e[y][x]=;
}
for(int t=;t<;t++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(e[i][j]^t)
len[t][i][j]=;
for(int t=;t<;t++)
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
len[t][i][j]=min(len[t][i][j],len[t][i][k]+len[t][k][j]);
if(len[][][n]>1e9||len[][][n]>1e9)
printf("-1\n");
else
printf("%d\n",max(len[][][n],len[][][n]));
return ;
}