最少转机

题目:

输入格式:
第一行的有两个整数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;
 }

猜你喜欢

转载自blog.csdn.net/qq_40761693/article/details/87276915