Cod sursa(job #586126)

Utilizator S7012MYPetru Trimbitas S7012MY Data 30 aprilie 2011 13:47:59
Problema Guvern Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define DN 200005
using namespace std;

typedef vector<int>::iterator it;
int lgm=1,val[DN],dp[DN],n;
vector<int> gr[DN],gf[DN],gt[DN];
bitset<DN> viz;

void build(int s) {
    viz[s]=1;
    for(it i=gr[s].begin(); i!=gr[s].end(); ++i) if(0==viz[*i]) {
        gf[s].push_back(*i);
        gt[*i].push_back(s);
        build(*i);
    }
}

void search(int s, int dest) {
    //if(s==dest) return;
    if(val[dest]<val[s] && dp[dest]<dp[s]+1) {
        dp[dest]=dp[s]+1;
        //cerr<<dest<<' '<<s<<' '<<dp[dest]<<'\n';
        lgm=max(dp[dest],lgm);
    }
    for(it i=gt[s].begin(); i!=gt[s].end(); ++i) search(*i,dest);

}

void dfs(int s) {
    dp[s]=1;
    search(s,s);
    for(it i=gf[s].begin(); i!=gf[s].end(); ++i) dfs(*i);
}

int main()
{
    ifstream f("guvern.in");
    ofstream g("guvern.out");
    f>>n;
    for(int i=1; i<n; ++i) {
        int a,b;
        f>>a>>b;
        gr[a].push_back(b);
        gr[b].push_back(a);
    }
    for(int i=1; i<=n; ++i) f>>val[i];
    build(1);
    viz&=0;
    dp[1]=1;
    for(it i=gf[1].begin(); i!=gf[1].end(); ++i) dfs(*i);
    g<<lgm;
    return 0;
}