题意:小哼和小哈一起坐飞机旅游,他们现在位于1号城市,目标是5号城市,可是1号城市没有到5号城市直航,不过他们收集了很多航班信息,现在他们要找出转机次数最少的方案。。。。。
样例:
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表示目标城市,接下来的每行“a b”,表示a,b之间有航线,也就是a,b之间可以相互到达。。。
思路:这是一个无向图,故用广度优先搜索。
代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct bb
{
int x,y; //x为城市的编号,y为转机次数
}now,nex;
int main()
{
int e[60][60]={0},book[60]={0};
int n,m,a,b,sx,end;
scanf("%d%d%d%d",&n,&m,&sx,&end);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j) e[i][j]=0; //如果相等则为0
else e[i][j]=99999999; //否则赋为99999999
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
e[a][b]=1; //注意这里是无向图,双向的。。。。。
e[b][a]=1;
}
queue<bb>q; //初始化队列
now.x=sx;
book[sx]=1;
now.y=0;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
for(int j=1;j<=n;j++)
{
if(e[now.x][j]!=99999999&&book[j]==0) //从j到此时有航班且不在队列中,没被访问过,即为1
{
book[j]=1;
nex.x=j;
nex.y=now.y+1;
q.push(nex);
}
if(nex.x==end)
{
break;
}
}
}
printf("%d\n",nex.y);
}