Cod sursa(job #916412)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 16 martie 2013 14:30:40
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
#define nmax 15001
using namespace std;
int n,m,x,y,z,cost,sum,dad[nmax],nr,k,i,up[nmax],T[nmax],niv[nmax],NIVEL(int);
vector<int>child[nmax];
vector <pair<int,pair<int,int> > >G;
int main()
{
    int min,max;
    vector<pair<int, pair<int,int> > >::iterator it;
    vector<int>::iterator IT;
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    scanf("%d%d%d", &n, &m, &k);
    for(i=1;i<=m;++i){scanf("%d%d%d", &x, &y, &z);G.push_back(make_pair(z,make_pair(x,y)));}
    sort(G.begin(),G.end());
    for(i=1;i<=n;++i)
    {
        dad[i]=i;
        child[i].push_back(i);
    }
    for(it=G.begin();it!=G.end()&&nr!=n-1;it++)
    {
        pair<int, pair<int,int> > nod=*it;
        if(dad[nod.second.first]!=dad[nod.second.second])
        {
            nr++;
            if(dad[nod.second.first]<dad[nod.second.second])
            {
                up[nod.second.second]=nod.first;
                T[nod.second.second]=nod.second.first;
                min=dad[nod.second.first];
                max=dad[nod.second.second];
            }
            else
            {
                up[nod.second.first]=nod.first;
                T[nod.second.first]=nod.second.second;
                min=dad[nod.second.second];
                max=dad[nod.second.first];
            }
            for(IT=child[max].begin();IT!=child[max].end();IT++)
            {
                dad[*IT]=min;
                child[min].push_back(*IT);
            }
        }
    }
    for(i=1;i<=n;++i)
        if(!niv[i])
            niv[i]=NIVEL(i);
    for(;k;--k)
    {
        scanf("%d%d", &x, &y);
        z=0;
        for(;x!=y;)
        {
            if(niv[x]>niv[y])
            {
                z=z>up[x]?z:up[x];
                x=T[x];
            } else {
                z=z>up[y]?z:up[y];
                y=T[y];
            }
        }
        printf("%d\n", z);
    }
    return 0;
}
int NIVEL(int nod)
{
    if(T[nod]==0)return 1;
    if(niv[nod])return niv[nod];
    return 1+NIVEL(T[nod]);
}