题目描述:
小哼和小哈一同坐飞机去旅游,他们现在位于1号城市,目标是5号城市,可是1号城市并没有到5号城市的直航。
不过小哼已经收集了很多航班的信息,现在小哼希望找到一种乘坐方式,使得转机的次数最少,如何解决?
输入:
第一行输入n,m,n表示城市的数量,m表示城市间的的航线,城市编号从1-n。
接下来m行输入每两个城市间的航线
最后一行输入起点城市和终点城市
样例:
5 7
1 2
1 3
2 3
2 4
3 4
3 5
4 5
1 5
样例结果输出:
2
代码:
#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
int e[50][50],book[50];
struct note{
int x;//城市编号
int s;//转机次数
}que[2500];
void init()
{
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]=INF; //i,j城市间没有通路
}
}
}
int main()
{
int head,tail,st,ed,cur;
int i,j,flag,n,m;
scanf("%d%d",&n,&m);
init();
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
e[a][b]=1;
e[b][a]=1;
}
head=tail=1;
scanf("%d%d",&st,&ed);
que[tail].x=st; que[tail].s=0;
tail++;
book[s]=1;
while(head<tail)
{
cur=que[head].x; //当前队列中首城市的编号
for(j=1;j<=n;j++) //从1-n依次尝试
{
//从城市cur到城市j是否有航班并且判断城市j是否在队列中
if(e[cur][j]!=INF&&book[j]==0)
{
//如果从城市cur到城市j有航班并且城市j不在队列中,则将j号城市入列
que[tail].x=j;
que[tail].s=que[head].s+1; //转机次数加1
tail++;
//标记城市j已经在队列中
book[j]=1;
}
//如果到达目标城市,停止扩展,任务结束,退出循环
if(que[tail].x==ed)
{
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
printf("%d\n",que[tail-1].s);
return 0;
}
摘自《啊哈!算法》