最少转机——图的广度优先遍历(邻接矩阵)
现在某地有h个机场,这些城市之间有k条航班,并且这些航班都是双行
第一行输入h,n,m,k
h表示机场个数,n表示出发机场,k表示目的机场,k表示双向航线个数
接下来k行,每行两个数据,第一个数据表示此条单行道的起始机场,第二个数据表示终点机场,
最后输出一行表示从n城市至m城市的最少转机次数
接着输出从出发机场至目的机场的转机顺序
样例输出:
5 1 5 7
1 2
1 3
2 3
2 4
3 4
3 5
4 5
样例输出:
2
1–3–5
需要注意的是,若只需求最少转机次数而不用输出转机路线图的话则把每条航班的航程当做一,这样的话使用dfs也可以做出来
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,h,min1=99999999;
int a[101][101]={0};
int book[105]={0};
struct note
{
int x;
int f;//这个是父元素,表示上一个机场;
int s;//这个表示已转次数
}que1[101];
int main()
{
int n1,n2,k;
scanf("%d%d%d%d",&h,&n,&m,&k);//h代表一共有h个机场,n代表出发的机场,m代表目的机场,k代表有k条双向航线
for(int i=1;i<=h;i++){
for(int j=1;j<=h;j++){
if(j==i)a[j][i]=0;
else a[i][j]=min1;
}
}
for(int i=1;i<=k;i++){
scanf("%d%d",&n1,&n2);
a[n1][n2]=1;//因为是无向图所以需赋值两个;
a[n2][n1]=1;
}
int head=1;
int tail=1;
book[n]=1;
que1[tail].f=0;
que1[tail].s=0;
que1[tail].x=n;
tail++;
int en=0;//用来标记是否结束;
while(head<tail){
int tx=que1[head].x;
for(int i=1;i<=h;i++){
if(a[tx][i]!=min1&&a[tx][i]!=0&&book[i]==0){
que1[tail].f=head;
que1[tail].s=que1[head].s+1;
que1[tail].x=i;
book[i]=1;
tail++;
if(i==m){
en=1;
break;
}
}
}
if(en!=0)break;
head++;
}
int c[101],i=0;//用来标记路径
cout<<"最少需要转机"<<que1[tail-1].s<<"次"<<endl;
tail-=1;
while(que1[tail].f!=0){
c[i++]=que1[tail].x;
tail=que1[tail].f;
}
c[i++]=n;
for(int j=i-1;j>=0;j--){
cout<<c[j];
if(j!=0)
cout<<"--";
}
cout<<endl;
return 0;
}