atcoder168D题

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

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

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

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

 

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

  • #include<stdio.h>
    #include<stdlib.h>
    #define size 100001
    int*pass[size];//链接任意2个room的集合 注意是指针数组,所以之后用到了指针数组的数组形式 如 pass[a][pass_s[a]]
    int deep[size];//这里本来理解错了,以为结果要输出的是深度,结果是要输出与该房间连接的房间号,详见题目
    // SO,这里deep应该要理解为与x号房间相连的上一层房间,记作deep[x]
    int pass_s[size];//对于每个room的路径数量统计
    int qu[size];//在后面存放结点用的队列数组
    int N,M;
    void set()
    {
        int a,b;
        //完成输入和初始化
        for(int j=0;j<N;j++){
           deep[j]=-1;
           pass_s[j]=0; 
        }
        deep[0]=0;
        for(int i=0;i<M;i++){
            scanf("%d %d",&a,&b);
            a--;b--;
            pass[a]=(int*)realloc(pass[a],sizeof(int)*(pass_s[a]+1));
            pass[a][pass_s[a]]=b;
            pass_s[a]++;
             pass[b]=(int*)realloc(pass[b],sizeof(int)*(pass_s[b]+1));
            pass[b][pass_s[b]]=a;
            pass_s[b]++;
        }
    }
    //完成计算
    void sys()
    {
        int point=0,tar=0,nm=0;
        while(1){
            for(int i=0;i<pass_s[tar];i++){
                 if(deep[pass[tar][i]]!=-1)continue;//只记录对于某一房间第一个上层房间,其他跳过
                 deep[pass[tar][i]]=tar+1;//指向房间号的deep为当前房间号+1即为题设房间号(因为预先减了1要再加回来)//deep[pass[tar][i]]=deep[tar]+1;这是计算深度用的
                qu[nm]=pass[tar][i];
                nm++;//利用队列实现类似BFS搜索,存储各个room
            }
            if(nm==point) break;
            tar=qu[point];
            point++;
        }

    }
    int main(){
        scanf("%d %d",&N,&M);
        set();
        sys();
        printf("Yes ");
        for(int i=1;i<N;i++){
         printf("%d ",deep[i]);
        }
        return 0;
    }

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

阳菜2

愿你一路晴天

天气之子

加油吧

原文地址:https://www.cnblogs.com/cryforbrightfuture/p/12920172.html