Cod sursa(job #2147499)

Utilizator alexandruilieAlex Ilie alexandruilie Data 28 februarie 2018 19:43:26
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <algorithm>
#define nmax 15005
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct muchie {int x,y,c;}v[2*nmax];
int t[nmax],viz[nmax],i,cost[nmax],h[nmax],n,m,k,j,k1,r1,r2,a,b;
int comp (muchie a,muchie b)
{
    return a.c<b.c;
}
int radacina(int a)
{
    while(a!=t[a])
        a=t[a];
    return a;
}
int lca(int a,int b)
{
    int aux=a,ct=0;
    while(a!=t[a])
    {
        viz[a]=i;
        a=t[a];
    }
    while(b!=t[b]&&viz[b]!=i)
        {
        ct=max(ct,cost[b]);
        b=t[b];
        }
    while(aux!=b)
    {
        ct=max(ct,cost[aux]);
        aux=t[aux];
    }
    return ct;
}
int main()
{
    f>>n>>m>>k;
    for(i=1;i<=m;i++)
        f>>v[i].x>>v[i].y>>v[i].c;
    sort(v+1,v+n+1,comp);
    j=1;k1=0;
    for(i=1;i<=n;i++) t[i]=i;
    while(k1<n-1)
    {
        r1=radacina(v[j].x);
        r2=radacina(v[j].y);
        if(r1!=r2) {
                //g<<v[j].x<<' '<<v[j].y<<'\n';
                k1++;
        if(h[r1]>h[r2]) {t[r2]=r1;cost[r2]=v[j].c;}
        else {t[r1]=r2;cost[r1]=v[j].c;}
        if(h[r1]==h[r2]) h[r2]++;}
        j++;
    }
    for(i=1;i<=k;i++)
    {
        f>>a>>b;
        g<<lca(a,b)<<'\n';
    }

    return 0;
}