B. Numbers on Tree(构造详解)

Posted iss-ue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B. Numbers on Tree(构造详解)相关的知识,希望对你有一定的参考价值。

传送门传送传送值啊都数时

(首先,构造千万不要想复杂了,尽量往简单的想)

(我们构造的a[i]应该互不相同最好,因为相同不好选择)

(比其中一个大就比很多个大,不好确定排名)

(color{Red}{既然如此,我就规定最终a[i]取[1,n]})

(这样一来根就被唯一确定是,a[root]=c[root]+1)

(然后dfs遍历下去,每次找到剩余没有用过的数字中第c[i]+1大的数)

(如果某个顶点的所有子节点数加起来都小于c[i],无解)

(某次为顶点找第c[i]+1大的数没找到,无解。)

#include <bits/stdc++.h>
using namespace std;
const int maxn=2009;
int n,c[maxn],root,l,temp[maxn],ans[maxn],flag,Size[maxn];
vector<int>vec[maxn];
int find(int x)
{
	int t=0;
	for(int i=1;i<=n;i++)
	{
		if(temp[i]==0)	continue;
		t++;
		if(t==x)
		{
			temp[i]=0;
			return i;
		}
	}
	return -1;
}
void dfs(int now)
{
	Size[now]=1;
	ans[now]=find(c[now]+1);//找剩下的第c[now]+1大的 
	if(ans[now]==-1)	flag=-1;
	for(int i=0;i<vec[now].size();i++)
	{
		int x=vec[now][i];
		dfs(x);
		Size[now]+=Size[x];
	}
	if(Size[now]-1<c[now])	flag=-1;//子树都比他小都到不了 
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)	temp[i]=i;
	for(int i=1;i<=n;i++)
	{
		cin>>l>>c[i];
		vec[l].push_back(i);
		if(l==0)	root=i;
	}
	dfs(root);
	if(flag==-1)	cout<<"NO";
	else
	{
		cout<<"YES"<<endl;
		for(int i=1;i<=n;i++)	cout<<ans[i]<<" ";
	}
}

以上是关于B. Numbers on Tree(构造详解)的主要内容,如果未能解决你的问题,请参考以下文章

[CF1286B] Numbers on Tree

D. Numbers on Tree

Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)

LeetCode | 0106. Construct Binary Tree from Inorder and Postorder Traversal从中序与后序遍历序列构造二叉树Python(示(代

java程序代码代写代写tree数据结构作业

1188A1 - Add on a Tree(思维,构造)