題意:小哼和小哈一起去做飛機旅遊,他們現在位於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;
}