atcoder168D题
总体分析:关于atcoder168D题的分析,主要是考虑不同结点的深度,并在考虑最浅的深度后再遇到此便不再考虑。
同时用队列数组来保证所有结点的呈现出树状图所有结点的遍历。
其三,用到了realloc函数来实现内存的解放,解决了静态存储占用大量空间的问题。
此外,用到了指针数组指向与该结点相连的各个结点集合。
在此,C语言代码奉上。还有题目的链接 https://atcoder.jp/contests/abc168/tasks/abc168_d
-
#include<stdio.h>#include<stdlib.h>#define size 100001int*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\n");for(int i=1;i<N;i++){printf("%d\n",deep[i]);}return 0;}