码迷,mamicode.com
首页 > 其他好文 > 详细

B. Numbers on Tree(构造详解)

时间:2020-05-17 17:59:15      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:math   tin   i++   复杂   back   span   return   简单   tps   

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

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

\(我们构造的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(构造详解)

标签:math   tin   i++   复杂   back   span   return   简单   tps   

原文地址:https://www.cnblogs.com/iss-ue/p/12905899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!