题目:
输入格式: | 第一行的有两个整数n m s e,n表示有n个城市(城市编号为1~n),m表示有m条航线,s表示起点城市,e表示目标城市。 接下来m行每行是一条类似“a b”这样的数据表示城市a和城市b之间有航线,也就是说城市a和城市b之间可以相互到达 |
输出格式: | s号城市到e号目标城市,需要飞行几次? |
限制: | 1<=n<=1000 1<=m<=300000 |
最开始的时候我一直觉得它的范围有问题,数组开不了这么大。。后来都设置成2501,把最大值改成2147483647,就过了。广度优先搜索的套路。
代码如下:
/*最少转机-图的广度优先遍历*/
#include <stdio.h>
struct node
{
int x;//城市编号
int s;//转机次数
} ;
int main()
{
struct node que[2501];
long e[2501][2501]={0},book[2501] = {0};
int head,tail;
int i,j,n,m,a,b,cur,start,end,flag=0;
scanf("%d%d%d%d",&n,&m,&start,&end);
for(i = 1;i <= n;i++)
{
for(j = 1;j <= m;j++)
{
if(i==j)
e[i][j] = 0;
else
e[i][j] = 2147483647;
}
}
for(i = 1;i <= m;i++)
{
scanf("%d%d",&a,&b);
e[a][b] = 1;
e[b][a] = 1;
}
head = 1;
tail = 1;
que[tail].x = start;
que[tail].s = 0;
tail++;
book[start] = 1;
while(head<tail)
{
cur = que[head].x;
for(j = 1;j <= n;j++)
{
if(e[cur][j]!=2147483647&&book[j]==0)
{
que[tail].x = j;
que[tail].s = que[head].s+1;;
tail++;
book[j] = 1;
}
if(que[tail-1].x==end)
{
flag = 1;
break;
}
}
if(flag==1)
{
break;
}
head++;
}
printf("%d",que[tail-1].s);
return 0;
}