最少轉機(圖的遍歷)

題意:小哼和小哈一起去做飛機旅遊,他們現在位於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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章