Cod sursa(job #2367679)

Utilizator TyFrostbyteIon Robert-Gabriel TyFrostbyte Data 5 martie 2019 11:55:15
Problema Guvern Scor 0
Compilator cpp-64 Status done
Runda bv_11_12 Marime 1.8 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>

using namespace std;

ifstream fin("guvern.in");
ofstream fout("guvern.out");


vector< vector<int> > G;
int n;
vector<int> val;
vector<int> rang;
vector<int> len;
vector<int> g;
void bfs()
{
    rang = vector<int>(n+1, 0);
    queue<int> q;
    q.push(1);
    rang[1]=1;

    while(!q.empty())
    {
        int here = q.front();
        for(int v : G[here])
        {
            if(rang[v]==0)
            {
                q.push(v);
                rang[v]=rang[here]+1;
            }
        }
        q.pop();
    }
}

bool cmp(int a, int b)
{
    if(rang[a]<rang[b])
        return true;
    return false;
}

int maxi(int a, int b)
{
    return ((a>b)?a:b);
}

int main()
{
    fin>>n;
    val = vector<int>(n+1);
    G = vector<vector<int> >(n+1);
    for(int i=0;i<n-1;i++)
    {
        int x,y;
        fin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    for(int i=1;i<=n;i++)
        fin>>val[i];

    bfs();

    g = vector<int>(n);
    for(int i=0;i<n;i++)
        g[i]=i+1;
    sort(g.begin(), g.end(), cmp);

    len = vector<int>(n+1, 1);
    for(int i=1; i<n;i++)
    {
        int mini=0;
        int minval=0x3f3f3f3f;
        for(int j=0; j<i;j++)
        {
            if(rang[g[j]]<rang[g[i]] && val[g[j]]>val[g[i]])
            {
                if(val[g[j]]<minval)
                {
                    mini = j;
                    minval=val[g[j]];
                }
                len[g[i]]=maxi(len[g[mini]]+1, len[g[i]]);
            }
        }
    }

    int maxx = 0;
    for(int x : g)
    {
        if(len[x]>maxx)
            maxx=len[x];
    }
    fout<<maxx;


    return 0;
}