题目链接:https://vjudge.net/contest/385137#problem/B
题意:给出n个点和m条铁路,输入m条铁路,如果两个点之间没有铁路直接相连,那么这两点之间存在公路,每次在两点间的公路或是铁路都耗时1,问两人分别使用公路和铁路从1点到n点共同需要的最少时间
解题思路:
通过理解题目,可以发现这是一个完全图,任意两点都有公路或者铁路的直接相连,所以一定有公路或铁路可以直接从1点到n点,耗时1,然后再对另一种交通方式进行bfs求得需要的最少时间即可
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
using namespace std;
#define maxn 410
int n,m;
int edge[maxn][maxn];
int vis[maxn];
int flag;
int cost[maxn];
int bfs(){
queue<int> q;
q.push(1);
vis[1]=1;
while(!q.empty()){
int u=q.front();
q.pop();
if(u==n){
return 1;
}
for(int i=1;i<=n;i++){
if(u==i) continue;
if(flag^edge[u][i]){
int v=i;
if(!vis[v]){
vis[v]=1;
cost[v]=cost[u]+1;
q.push(v);
}
}
}
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
edge[a][b]=edge[b][a]=1;
}
if(edge[1][n]==1) flag=1;
else
flag=0;
int res=bfs();
if(res==-1)
cout<<res<<endl;
else{
cout<<cost[n]<<endl;
}
return 0;
}