思路: 最短路径,但是题目中有烦人的条件,即汽车和火车不能同时到达同一个中间城市(1,n除外),
如果没有这个条件,那么这道题就是分别求两次最短路径即可。
其实这是个坑人的条件
我们来细想一下
首先,1-n之间各个城市都是有路的,不是公路就是铁路,那么城市1和城市n之间,必然有一条公路或者铁路,假如1-n之间是公路,那么汽车直接走,便是1h,火车必然要绕开这条路,从别的城市中转。
同理,假如这条路是铁路,那么汽车就要去别的城市中转,所以其实这个条件就是迷惑人用的。
而且迷惑到我了:(
数组f[i][j]是i城市到j城市的距离
默认初始化为无穷大表示无穷远即两者之间没有路
#include <iostream>
#include <cstring>
#include <algorithm>
#include <limits.h>
using namespace std;
int m,n;
const int N = 500;
#define INF 0x3f3f3f3f
int f[N][N],g[N][N];
int floyd(int e[][N])
{
for(int k=1;k<=n;k ++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
e[i][j] = min(e[i][j],e[k][j]+e[i][k]);
return e[1][n];
}
int main()
{
cin>>n>>m;
memset(f, 0x3f, sizeof f);
memset(g, 0x3f,sizeof g);
while(m--)
{
int a,b;
scanf("%d%d", &a, &b);
f[a][b] = f[b][a] = 1;
}
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
if(i!=j&&f[i][j]!=1)
g[i][j] = 1;
int res = max(folyd(f),folyd(g));
if(res == INF)
cout<<"-1"<<endl;
else
cout<<res<<endl;
}
如果不会floyd的可以看这篇文章,讲的蛮好的!