Cod sursa(job #1133259)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 4 martie 2014 17:48:51
Problema Heavy Path Decomposition Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <algorithm>
#include <cstring>
#include <memory.h>

#define Nmax 100005

using namespace std;
int val[Nmax],weight[Nmax],lantz[Nmax];
int N,Q;
bitset<Nmax>used,fol;
vector<int> G[Nmax];

class cmp{
public:
    bool operator()(const int x,const int y)const
    {
        return weight[x] < weight[y];
    }
};

void read()
{
    int a,b;
    scanf("%d%d",&N,&Q);
    for(int i = 1; i <= N; ++i)
        scanf("%d",&val[i]);
    for(int i = 1; i < N; ++i){
        scanf("%d%d",&a,&b);
        G[a].push_back(b);
        G[b].push_back(a);
    }
    memset(weight,-1,sizeof(weight));
    for(int i = 2; i <= N; ++i)
        if(G[i].size() == 1)
            weight[i] = 0;/// pot doar ajunge in el

}

void DFS(int k)
{
    used[k] = 1;
    for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
        if(!used[*it])
            DFS(*it);
    int s = 0;
    for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
        s += weight[*it] + 1;
    weight[k] = s;
}

void get_weigh()
{
    DFS(1);
    for(int i = 1; i <= N; ++i)
        sort(G[i].begin(),G[i].end(),cmp());
    used = 0;
}
int nrl = 1;

void get_links(int k)
{
    used[k] = 1;
    for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
        if(!used[*it])
            DFS(*it);
}

int main()
{
    freopen("heavypath.in","r",stdin);
    freopen("heavypath.out","w",stdout);

    read();
    get_weigh();
    get_links(1);

    return 0;
}