Cod sursa(job #586198)

Utilizator MKLOLDragos Ristache MKLOL Data 30 aprilie 2011 14:03:58
Problema Guvern Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 2.56 kb
#include<algorithm>
#include<stdio.h>
#include<vector>

#define pb push_back

using namespace std;
vector<int> g[202020],frun;
int tata[202020],x,y,N;
int viz[202020];
int minim[202020];
int ind[202020],was[101010],was2[101010];
int nr[202020];
int maxi[10100],maxim1,ok;
int qp;
void df(int x)
{
    viz[x]=1;
    for(int i=0;i<g[x].size();++i)
    {
        if(!viz[g[x][i]])
        {
            tata[g[x][i]]=x;
            df(g[x][i]);
        }
    }
}
inline void calc(int x)
{
    minim[x]=1234567;
        int p=tata[x];
        while(p!=0)
        {
            if(nr[p]>nr[x])
            {
                if(minim[x]>nr[p])
                    {
                    minim[x]=nr[p];
                    ind[x]=p;
                    }
            }
            p=tata[p];
        }

}
void df2(int x)
{
    was2[x]=1;
    int p=ind[x];
    while(p!=0)
    {
        was2[p]=1;
        p=ind[p];
    }

}
void ver(int x)
{
    if(was2[x]==1)
    {
        maxi[x]=nr[x];
    }
    viz[x]=1;
    for(int i=0;i<g[x].size();++i)
    {
        if(!viz[g[x][i]])
        {
            ver(g[x][i]);
            if(was2[x])
            {
                if(maxi[g[x][i]]>nr[x])
                   ok=0;
            }
        }
    }
}
void back(int k)
{
    if(k==frun.size()+1)
    {
        if(qp)
        {


        for(int i=1;i<=N;++i)
            {
            was2[i]=0;
            viz[i]=0;
            }
        for(int i=1;i<=N;++i)
            maxi[i]=0;
        for(int i=0;i<frun.size();++i)
        if(was[i])
        {
            df2(frun[i]);
        }

        ok=1;
        ver(1);
        if(ok)
        {int rez=0;
            for(int i=1;i<=N;++i)
              if(was2[i])
              {
                  ++rez;
              }
            maxim1=max(maxim1,rez);
        }
        }
    }else{
    ++qp;
    was[k-1]=1;
    back(k+1);
    --qp;
    was[k-1]=0;
    back(k+1);
    }
    return;
}
int main()
{
freopen("guvern.in","r",stdin);
freopen("guvern.out","w",stdout);
    scanf("%d",&N);
    if(N>100)
        printf("%d\n",N/6);
    for(int i=1;i<N;++i)
    {
    scanf("%d%d",&x,&y);
    g[x].pb(y);
    g[y].pb(x);
    }
    df(1);

    for(int i=1;i<=N;++i)
        scanf("%d",&nr[i]);
    for(int i=1;i<=N;++i)
    {
        calc(i);
    }
    for(int i=1;i<=N;++i)
    {
       viz[ind[i]]=0;
    }
    for(int i=1;i<=N;++i)
    {
        if(viz[i])
        frun.pb(i);
    }

    back(1);
    printf("%d ",maxim1);
}