0
点赞
收藏
分享

微信扫一扫

Valid BFS? CodeForces - 1037D

​​http://codeforces.com/contest/1037/problem/D​​

设一个队头一个队尾 队尾元素必须是队首元素的子节点 否则就是非法序列 当队首元素的所有孩子节点都出现过后就出队列 然后继续判断下一个队首 直至队尾扫过整个序列 模拟一遍就好

#include <bits/stdc++.h>
using namespace std;

struct node
{
int v;
int next;
};

node edge[400010];
int first[200010],que[200010],cnt[200010],book[200010],fa[200010];
int n,num;

void addedge(int u,int v)
{
edge[num].v=v;
edge[num].next=first[u];
first[u]=num++;
}

int main()
{
int i,u,v,flag,head,tail,tmp;
scanf("%d",&n);
memset(first,-1,sizeof(first));
num=0;
for(i=1;i<=n-1;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
for(i=1;i<=n;i++) scanf("%d",&que[i]);
if(que[1]!=1)
{
printf("No\n");
return 0;
}
head=1,tail=2,tmp=0;
for(i=first[1];i!=-1;i=edge[i].next)
{
v=edge[i].v,tmp++;
fa[v]=1;
}
cnt[1]=tmp;
num=0,flag=1;
while(tail<=n)
{
u=que[tail];
//printf("***%d %d***\n",que[head],u);
if(fa[u]!=que[head])
{
flag=0;
break;
}
tmp=0;
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(v!=fa[u])
{
//printf("*%d*\n",v);
tmp++;
fa[v]=u;
}
}
cnt[tail]=tmp;
num++;
if(num==cnt[head])
{
num=0;
head++;
while(cnt[head]==0&&head<=tail) head++;
}
tail++;
}
if(flag) printf("Yes\n");
else printf("No\n");
return 0;
}

/*
7
1 2
1 3
2 4
3 5
4 6
5 7
1 3 2 5 4 7 6

10
1 2
1 3
2 4
2 5
3 6
4 7
6 8
6 9
6 10
1 2 3 4 5 6 7 8 9 10
*/

 


举报

相关推荐

0 条评论