BFS?树的一道题TLE60分

题目描述

提交记录

I. BFS?

Problem ID: 15654

Contest ID: 5942

必做题

Time Limit Exceeded

60 分

题目描述

用BFS算法可以遍历得到一棵树,但是根据遍历结点顺序的不同,最终得到的序列也不同。

在这个问题中,给你一个序列和一棵根结点为1的树,你需要判断通过BFS遍历得到的序列是否和所给序列相同。

输入示例

第一行输入一个整数n(1≤n≤2∗105),表示树的点数。

接下来n−1行,每行输入两个整数x和y(1≤x,y≤n),表示一条边。数据保证所给的图是一棵树。

最后一行包含了n个整数a1,a2,…,an(1≤ai≤n),表示需要判断的序列。

输出示例

如果能通过BFS得到所给的序列,输出"Yes",否则输出"No"。

样例1

输入样例

4 1 2 1 3 2 4 1 3 2 4

输出样例

Yes

样例2

输入样例

4 1 2 1 3 2 4 1 2 4 3

输出样例

No

样例说明

两个样例所给的树是相同的,这颗树可以得到两种不同的BFS序列:

  • 1,2,3,4
  • 1,3,2,4

样例2的1,2,4,3并不能与上述BFS序列相匹配。

#include <bits/stdc++.h>
using namespace std;
vector<int>a[200005];
int cnt[200005];
int ans[200005];
int k = 1;
int main()
{
	int n;
	scanf("%d",&n);
	for(int i = 1;i<=n-1;i++) 
	{
		int x,y;
		scanf("%d %d",&x,&y);	
		a[x].push_back(y);
		a[y].push_back(x);
	}
	for(int i = 1;i<=n;i++)
	{
		scanf("%d",&cnt[i]);
	}
	ans[1] = cnt[1];
	int x = 1;
	while(x<n)
	{
		int q = k;
		for(int i = x+1;i<=x+a[x].size()&&i<=n;i++)
		{
			bool flag = 0;
			for(int j = 1;j<=k;j++)
			{
				if(find(a[ans[j]].begin(),a[ans[j]].end(),cnt[i])!=a[ans[j]].end())
				{
					flag = 1;
					break;
				}
			}
			if(flag == 0)
			{
				printf("No");
				return 0;
			}
			ans[++k] = cnt[i];	
		}
		ans[q] = 0;
		x = x+a[x].size();
	}
	printf("Yes"); 
	return 0;
}

代码TLE60分

屏幕截图 2023-08-02 184835

虽说是TLE,但只有一个TLE的点

求助
!!!!!!

直接按题目说的来模拟不就行了?
我们建立一个id数组,根据输入的优先级进行升序的排序,然后这样子进行BFS模拟才可能得到这一效果,你这个不理解的话树状数组可要在以后好好学了
老师上课讲的时候不就是这样讲的吗