转载:https://blog.youkuaiyun.com/qq_36368339/article/details/82343737
题意:给你一颗树(无向图),问你是否满足BFS序?
分析:用dfs把树离出来(应该相当于分支杆),然后bfs去遍历,看是否满足;由于兄弟节点顺序可能不一致,用set查找,如果在set里面,说明存在这个序。
代码:
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <list>
#include <deque>
#include <set>
#include <vector>
#include <map>
#define LL long long
#define max(a,b) (a>b?a:b)
using namespace std;
const int MAXN=2e5+7;
//int a[MAXN][4],n;
//multiset<int>s[4];
vector<int>Edge[MAXN];
set<int>s[MAXN];
int vis[MAXN];
void dfs(int fr,int to)//分离枝干
{
for(int i=0;i<Edge[fr].size();i++)
{
int now=Edge[fr][i];
if(now!=to)
{
s[fr].insert(now);
dfs(now,fr);
}
}
}/*
void bfs(int s)
{
queue<int>Q;
if(!vis[s])
vis[s]=1;
Q.push(s);
while(!Q.empty())
{
int now=Q.front();
Q.pop();
for(int i=0;i<Edge[now].size();i++)
{
int nex=Edge[now][i];
if(!vis[nex])
{
num[nex].Rank=num[now].Rank+1;
vis[nex]=1;
Q.push(nex);
}
}
}
}*/
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n;
int fr,to;
for(int i=0;i<n-1;i++)
{
cin>>fr>>to;
Edge[fr].push_back(to);
Edge[to].push_back(fr);
}
dfs(1,0);
int x;
cin>>x;
if(x!=1)
{
cout<<"No"<<endl;
return 0;
}
queue<int>q;
q.push(x);
int a;
int now=0,flag=1;
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=0;i<s[now].size();i++)//查找是否存在这个枝(顺序不同)
{
cin>>x;
if(s[now].find(x)==s[now].end()||vis[x])flag=0;
if(!flag)break;
vis[x]=1;
q.push(x);
}
if(!flag)break;
}
if(flag)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}