Cod sursa(job #929359)

Utilizator lily3Moldovan Liliana lily3 Data 26 martie 2013 23:28:13
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

int i,j,n,m,niv[15001],tata[15001],k,m1,m2;
int max1,c[15001],cost1;
bool viz[15001];
struct muchii
{
    int x,y,cost;
};
muchii a[30001];

void aflanivel(int x)
{
    if(tata[x]==x)
    return ;
    aflanivel(tata[x]);
    niv[x]=niv[tata[x]]+1;
}
bool cmp(muchii a,muchii b)
{
    return a.cost<b.cost;
}
int componenta(int x)
{
    int r=x;
    while(r!=tata[r])
    r=tata[r];
    return r;
}
int main()
{
    ifstream f("radiatie.in");
    ofstream g("radiatie.out");
    f>>n>>m>>k;
    for(i=1;i<=m;++i)
    f>>a[i].x>>a[i].y>>a[i].cost;

    sort(a+1,a+m+1,cmp);
    for(i=1;i<=n;++i)
    tata[i]=i;

    int nr=0;
    //pt a alfa maximul de la un nod x la un nod y refac arborele astfel incat sa tin pt fiecare nod fii "absoluti necesari"
    //un fiu este "absolut necesar" daca maximul dintre drumul de la tata si oricare succesor al fiului se afla pe muchi tata-fiu
    for(i=1;i<=m&&nr<n;++i)
    {
        m1=componenta(a[i].x);
        m2=componenta(a[i].y);
        if(m1!=m2)
        {
            tata[m1]=m2;//construesc vectorul de tati cu ajutorul apm costul fiind sortat convenabil
            c[m1]=a[i].cost;
            ++nr;
        }
    }

    for(i=1;i<=n;++i)
    if(!niv[i])
    aflanivel(i);

    for(i=1;i<=k;++i)
    {
        f>>m1>>m2;
        max1=0;
        //pe arborele format merg din tata in fiu pana la stramosul comun
        while(niv[m1]>niv[m2])
        {
            max1=max(c[m1],max1);
            m1=tata[m1];
        }

        while(niv[m2]>niv[m1])
        {
            max1=max(c[m2],max1);
            m2=tata[m2];
        }

        while(m1!=m2)
        {
            max1=max(max1,max(c[m1],c[m2]));
            m1=tata[m1];
            m2=tata[m2];
        }

        g<<max1<<"\n";
    }
    return 0;
}