codeforces 1286B números en árbol

Pregunta:
Un árbol tiene n nodos y cada nodo tiene un peso. Defina la matriz c [i] como el número de puntos en el subárbol de i cuyo peso es menor que i. Ahora díganos el valor de la matriz c Valor, construyamos el peso de cada punto para satisfacer la matriz c, si no se puede construir, salida no.
Solución:
Obviamente, cuando el tamaño del subárbol del nodo i <= c [i], no se puede construir. Luego considere la situación que se puede construir, hay un total de n nodos, luego podemos asignar cada número de 1 an a estos puntos por turno, de modo que debe haber una respuesta. Entonces, ¿cómo asignas valores específicamente? Si asignamos valores desde la parte inferior del árbol hacia arriba, entonces es posible que los valores anteriores afecten la parte inferior. Solo podemos asignar valores desde la raíz a las hojas. Cuando atravesamos un nodo u, c [u] = x, buscamos el x + 1º número no utilizado de 1 an, de modo que podamos asegurarnos de que los primeros x números no utilizados aparecerán en su subárbol.
Código:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define iss std::ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
const int MAXN=1e5+5;
int n; 
int c[2005];
int head[2005];
int cnt=0;
int fa[2005];
int sz[2005];
int flag=0;
int vis[2005];
int w[2005];
struct node
{
    
    
    int to;
    int next;
}e[4005];
void add(int u,int v)
{
    
    
    e[cnt].to=v;
    e[cnt].next=head[u];
    head[u]=cnt++;
}
void dfs(int u,int f)
{
    
    
    sz[u]=1;
    for(int i=head[u];i!=-1;i=e[i].next)
    {
    
    
        int v=e[i].to;
        if(v==f) continue;
        dfs(v,u);
        sz[u]+=sz[v];
    }
    if(c[u]>sz[u]-1) flag=1;
}
void solve(int u,int f)
{
    
    
    int cnt=c[u]+1;
    for(int i=1;i<=n;i++)
    {
    
    
        if(vis[i]==0) cnt--;
        if(cnt==0)
        {
    
    
            w[u]=i;
            vis[i]=1;
            break;
        }
    }
    for(int i=head[u];i!=-1;i=e[i].next)
    {
    
    
        int v=e[i].to;
        if(v==f) continue;
        solve(v,u);
    }
}
int main()
{
    
    
    memset(head,-1,sizeof head);
    memset(sz,0,sizeof sz);
    memset(vis,0,sizeof vis);
    //int n;
    cin>>n;
    int root;
    for(int i=1;i<=n;i++)
    {
    
    
        cin>>fa[i]>>c[i];
        if(fa[i]==0) root=i;
        else
        {
    
    
            add(fa[i],i);
            add(i,fa[i]);
        }
    }
    dfs(root,0);
    if(flag==1)
    {
    
    
        cout<<"NO"<<endl;
        return 0;
    }
    solve(root,0);
    cout<<"YES"<<endl;
    for(int i=1;i<=n;i++)
    {
    
    
        cout<<w[i]<<" ";
    }
}


Supongo que te gusta

Origin blog.csdn.net/weixin_45755679/article/details/107882008
Recomendado
Clasificación