在一个国家中有许多条飞机线路,求从a地到b地最少转机。
输入:
例
5 7 1 5
1 2
1 3
2 3
2 4
3 4
3 5
4 5
说明:
第一行的5表示有5个城市(城市编号1~5),7代表有7条航线,1表示起点城市,5表示终点城市。
接来下7行a b表示a与b地间有航班
输出:
2
思路:通过bfs寻找a到b地的最少转机
代码:
#include<iostream>
using namespace std;
struct note
{
int x;//城市编号
int s;//转机次数
};
int main(){
note que[2501];
int e[51][51]={0},book[51]={0};
int head,tail;
int flag=0;
int n,m,start,end;
cin>>n>>m>>start>>end;
//初始化二维矩阵
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
e[i][j]=1;
}else{
e[i][j]=99999999;
}
}
}
//读入从城市之间的航班
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;
}
//队列初始化
tail=1;
head=1;
//从start号城市出发,将start号城市加入队列
que[tail].x=start;
que[tail].s=0;
tail++;
book[1]=start;//标记start号城市已经在队列中
//当队列不为空的时候
while(head<tail){
int cur=que[head].x;//当前队列中首城市的编号
for(int i=1;i<=n;i++){//从1~n依次尝试
if(e[cur][i]!=99999999&&book[i]==0){
book[i]=1;
que[tail].x=i;
que[tail].s=que[head].s+1;
tail++;
}
if(que[tail].x==end){
flag=1;
break;
}
}
if(flag==1){
break;
}
head++;
}
cout<<que[tail-1].s<<endl;
return 0;
}