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]<<" ";
    	}
    }
    
  • 相关阅读:
    hihocoder 1049 后序遍历
    hihocoder 1310 岛屿
    Leetcode 63. Unique Paths II
    Leetcode 62. Unique Paths
    Leetcode 70. Climbing Stairs
    poj 3544 Journey with Pigs
    Leetcode 338. Counting Bits
    Leetcode 136. Single Number
    Leetcode 342. Power of Four
    Leetcode 299. Bulls and Cows
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12905899.html
Copyright © 2011-2022 走看看