zoukankan      html  css  js  c++  java
  • 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]<<" ";
    	}
    }
    
  • 相关阅读:
    Go语言
    Go语言
    electron-builder vue3 用户自定义安装目录
    提取页面中的style标签内容
    px2rpx | px转rpx
    js EventBus
    select 下拉选择多个值
    keep-alive页面缓存
    js适配移动端页面
    vue日常问题记录
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12905899.html
Copyright © 2011-2022 走看看