atcoder168D题

总体分析:关于atcoder168D题的分析,主要是考虑不同结点的深度,并在考虑最浅的深度后再遇到此便不再考虑。

同时用队列数组来保证所有结点的呈现出树状图所有结点的遍历。

其三,用到了realloc函数来实现内存的解放,解决了静态存储占用大量空间的问题。

此外,用到了指针数组指向与该结点相连的各个结点集合。

在此,C语言代码奉上。还有题目的链接     https://atcoder.jp/contests/abc168/tasks/abc168_d

  • #include<stdio.h>
    #include<stdlib.h>
    #define size 100001
    
    int N,M;
    int*dist[size];
    int city[size];
    int qu[size];
    int dist_s[size];
    
    void set(){
      int a,b;
      for(int i=0;i<N;i++){
        city[i]=-1;
        dist_s[i]=0;
      };
      city[0]=0;
      for(int i=0;i<M;i++){
        scanf("%d %d",&a,&b);
        a--;b--;
        dist[a]=realloc(dist[a],sizeof(int)*(dist_s[a]+1));
         dist[a][dist_s[a]]=b;//得出由a城到b城的所有可能路径
          dist_s[a]++;
        dist[b]=realloc(dist[b],sizeof(int)*(dist_s[b]+1));
         dist[b][dist_s[b]]=a;
          dist_s[b]++;
      };
    };
    
    void sys(){
      int tar=0,nm=0,ji=0;
      while(1){
        for(int i=0;i<dist_s[tar];i++){//到目标城市的所有可能
          if(city[dist[tar][i]]!=-1)continue;
          city[dist[tar][i]]=tar+1;//目标城市深度
          qu[nm]=dist[tar][i];//到达深度的各城市队列
          nm++;
        };
        if(nm==ji)break;
        tar=qu[ji];//计算队列中第一个城市
        ji++;
      };
    };
        
    int main(void){
       scanf("%d%d",&N,&M);
       set();
       sys();
       printf("Yes\n");
       for(int i=1;i<N;i++){
         printf("%d\n",city[i]);
       };
      
      return 0;
    }

就是这样子了,详见对代码的注释

阳菜2

愿你一路晴天

天气之子

加油吧

猜你喜欢

转载自www.cnblogs.com/cryforbrightfuture/p/12920172.html