Cod sursa(job #1490076)

Utilizator vladttturcuman vlad vladtt Data 22 septembrie 2015 18:29:55
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin("radiatie.in");
ofstream fout("radiatie.out");

struct Edge{
    int x,y,c;
    bool operator< (Edge a) const
    {
        return c<a.c;
    }
}edge[31000];

struct noduri{
    int parent,CostToGrow,niv;
}nod[16000];

int i,n,k,m,x,y;

int Top(int nod,int &Deep)
{
    Deep=0;
    while(::nod[nod].parent!=nod)
    {
        nod=::nod[nod].parent;
        Deep++;
    }
    return nod;

}

void apm()
{
    int RemainingEdges=n-1;

    int Xparent,Yparent,Xdeep,Ydeep,i=1;

    while(i<=m && RemainingEdges!=0)
    {
        Xparent=Top(edge[i].x,Xdeep);
        Yparent=Top(edge[i].y,Ydeep);

        if(Xparent!=Yparent)
        {
            if(Xdeep>=Ydeep)
            {
                nod[edge[i].y].parent=Xparent;
                nod[edge[i].y].CostToGrow=edge[i].c;
            }
            else
            {
                nod[edge[i].x].parent=Yparent;
                nod[edge[i].x].CostToGrow=edge[i].c;
            }

            RemainingEdges--;
        }

        i++;
    }

}

int Rate(int nod)
{
    if(::nod[nod].parent==nod)
        return (::nod[nod].niv=1)+1;
    if(::nod[nod].niv!=0)
        return ::nod[nod].niv+1;
    else
        return (::nod[nod].niv = Rate(::nod[nod].parent))+1;
}

int maxEdge(int nod1,int nod2)
{
    int Max=0;
    while(nod1!=nod2)
    {
        if(nod[nod1].niv<=nod[nod2].niv)
        {
            if(nod[nod2].CostToGrow>Max)
                Max=nod[nod2].CostToGrow;
            nod2=nod[nod2].parent;
        }
        else
        {
            if(nod[nod1].CostToGrow>Max)
                Max=nod[nod1].CostToGrow;
            nod1=nod[nod1].parent;
        }
    }
    return Max;
}

int main()
{
    fin>>n>>m>>k;
    for (i=1;i<=m;i++)
        fin>>edge[i].x>>edge[i].y>>edge[i].c;

    for (i=1;i<=n;i++)
        nod[i].parent=i;

    sort(edge+1,edge+m+1);

    apm();

    for (i=1;i<=n;i++)
        if (nod[i].niv==0)
            Rate(i);

    for (i=1;i<=k;i++)
    {
        fin>>x>>y;
        fout<<maxEdge(x,y)<<'\n';
    }


    return 0;
}