标题: | 最少转机 | ||
标签: | 搜索 广度优先搜索 | ||
详情: |
小哼和小哈一同坐飞机去旅游,他们现在位于1号城市,目标是5号城市,可是1号城市并没有到5号城市的直航。不过小哼已经收集了很多航班的信息,现在小哼希望找到一种乘坐方式,使得转机的次数最少,如何解决呢?
| ||
输入格式: | | ||
输出格式: | | ||
限制: | 1<=n<=1000 1<=m<=300000 | ||
样例: |
|
#include <stdio.h>
#define maxn 1050
int ar[maxn][maxn], flag[maxn];
int n, m, s, e;
struct node{
int s;
int x;
}que[maxn];
int main()
{
int i, j, a, b, head = 1, tail = 1, min = 99999999,flag1 = 0;
scanf("%d %d %d %d", &n, &m, &s, &e);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(i == j) ar[i][j] = 0;
else ar[i][j] = 99999999;
}
}
for(i = 1; i <= m; i++)
{
scanf("%d %d", &a, &b);
ar[a][b] = 1; //无向图的特点,注意
ar[b][a] = 1;
}
que[tail].x = s; //初始化要完整全面,不要初始化了队列忘了标记数组。
que[tail].s = 0;
tail++;
flag[s] = 1; // 标记数组初始化
while(head < tail && tail <= n)
{
int cur = que[head].x;
for(i = 1; i <= n; i++)
{
if(ar[cur][i] != 99999999 && flag[i] == 0)
{
que[tail].x = i;
que[tail].s = que[head].s + 1;
tail++;
flag[i] = 1;
}
if(que[tail-1].x == e) // 已经到了终点
{
flag1 = 1;
break;
}
}
if(flag1 == 1) break;
if(tail > n) break;
head++;
}
printf("%d", que[tail-1].s);
return 0;
}