CF602C.The Two Routes(思维+完全图+bfs)

题目链接:https://vjudge.net/contest/385137#problem/B
题意:给出n个点和m条铁路,输入m条铁路,如果两个点之间没有铁路直接相连,那么这两点之间存在公路,每次在两点间的公路或是铁路都耗时1,问两人分别使用公路和铁路从1点到n点共同需要的最少时间
解题思路:
通过理解题目,可以发现这是一个完全图,任意两点都有公路或者铁路的直接相连,所以一定有公路或铁路可以直接从1点到n点,耗时1,然后再对另一种交通方式进行bfs求得需要的最少时间即可

#include
#include
#include
#include
#include
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;
}

你可能感兴趣的:(基础专题,图论)