Cod sursa(job #1006234)

Utilizator cat_red20Vasile Ioana cat_red20 Data 6 octombrie 2013 18:02:21
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<fstream>
#include<algorithm>
using namespace std;
int tata[15001],cost[15001],m,n,k,adanc[15001];
struct muchie
{
    int x,y,c;
}v[30001];
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");

void citire()
{
    fin>>n>>m>>k;
    for(int i=1;i<=m;i++)
    {
        fin>>v[i].x>>v[i].y>>v[i].c;
    }
}

void kruskal()
{
    int x,y,k=0,c;
    for(int i=1;i<=m && k<n;i++)
    {
        x=v[i].x;
        y=v[i].y;
        c=v[i].c;
        while(tata[x]>0)
            x=tata[x];
        while(tata[y]>0)
            y=tata[y];
        if(x!=y)
        {
            k++;
            if(tata[x]>tata[y])
            {
                tata[y]+=tata[x];
                tata[x]=y;
                cost[x]=c;
            }
            else
            {
                tata[x]+=tata[y];
                tata[y]=x;
                cost[y]=c;
            }
        }
    }
}

int cmp(muchie A,muchie B)
{
    return A.c<B.c;
}

void initializare()
{
    for(int i=1;i<=n;i++)
        tata[i]=-1;
}

void querries()
{
    int x,y,sol;
    for(int i=1;i<=k;i++)
    {
        fin>>x>>y;
        sol=0;

        for(;adanc[x]>adanc[y];x=tata[x])
        {
            if(cost[x]>sol)
            sol=cost[x];
        }
        for(;adanc[y]>adanc[x];y=tata[y])
        {
            if(cost[y]>sol)
            sol=cost[y];
        }
        for(;x!=y;x=tata[x],y=tata[y])
        {
            if(cost[x]>sol)
            sol=cost[x];
            if(cost[y]>sol)
            sol=cost[y];
        }
        fout<<sol<<"\n";
    }
}

void adancimi()
{
    int x;
    for(int i=1;i<=n;i++)
    {
        x=i;
        while(tata[x]>0)
        {
            adanc[i]++;
            x=tata[x];
        }
    }
}

int main()
{
    citire();
    initializare();
    sort(v+1,v+m+1,cmp);
    kruskal();
    adancimi();
    querries();

    return 0;
}