最少转机(图的遍历)

题意:小哼和小哈一起去做飞机旅游,他们现在位于a号城市,目标城市是b号城市,可以a号城市没有直达b号城市的航班,不过小哼已经收集了很多的航班信息,现在小哼希望找一种乘坐方式使得转机次数最少,如何解决呢?
样例输入
5 7 1 5
1 2
1 3
2 3
2 4
3 4
3 5
4 5

样例输出
2

说明:第一行表示有四个数分别表示:第一个数:有n个城市 第二个数:有m条航线 第三个数:起点是a城市 第四个数:终点是b城市
下面的m行是类似“a b”这样的数据,表示a城市与b城市有航线,也就是说,a城市和b城市可以互达

BFS实现

#include<cstdio>
#include<queue>
using namespace std;
int n,m,a,b;
bool vis[201];
int e[201][201];
int min;
int main(){
	scanf("%d %d %d %d",&n,&m,&a,&b);
	for(int i=1;i<=n;i++){//初始化二维矩阵
		for(int j=1;j<=n;j++){
			if(i==j){
				e[i][j]=0;
			}else{
				e[i][j]=99999999;
			}
		}
		
	}
	   int t1,t2;
		for(int i=1;i<=m;i++){//读入航线信息
			scanf("%d %d",&t1,&t2);
			e[t1][t2]=1;
			e[t2][t1]=1;//两个城市可以互达
		}
		vis[a]=true;//起点装入队列
		queue<int>que;
		queue<int>step;
		que.push(a);
		step.push(0);
		while(!que.empty()){
			if(que.front()==b){
				printf("%d\n",step.front());
				return 0;//遍历到了b直接退出
			}
			for(int i=1;i<=n;i++){
				if(!vis[i]&&e[que.front()][i]==1){
					vis[i]=true;
					que.push(i);
					step.push(step.front()+1);
				}
			}
			que.pop();
			step.pop();
		}
		
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章