Cod sursa(job #1016303)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 26 octombrie 2013 00:32:34
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <algorithm>
#include <vector>

#define In "radiatie.in"
#define Out "radiatie.out"
#define edge pair < int ,pair < int ,int > >
#define Nmax 15004
#define Mmax 30004
#define x second.first
#define y second.second
#define cost first
using namespace std;
edge e[Mmax];
int n, m, niv[Nmax] ,c[Nmax];
vector < int > Tree[Nmax];
int Father[Nmax];
struct DisjointSets
{
    inline void Buid()
    {
        for(int i = 1;i <= n; ++i)
            Father[i] = i;
    }
    inline int Find(int node)
    {
        while(node!=Father[node])
            node = Father[node];
        return node;
    }
    inline void Union(const int X,const int Y)
    {
        Father[X] = Y;
    }
};
DisjointSets S;
inline void APM()
{
    sort(e+1,e+m+1);
    int i ,X ,Y;
    S.Buid();
    for(i = 1;i <= n; ++i)
    {
        X = S.Find(e[i].x) ;
        Y = S.Find(e[i].y) ;
        if(X != Y)
        {
           S.Union(X,Y);
           c[X] = e[i].cost;
        }
    }
}
inline void Niv(const int X)
{
    if(Father[X]==X)
        return ;
    Niv(Father[X]);
    niv[X] = niv[Father[X]]+1;
}
int main()
{
    int i, k, sol ,X ,Y;
    ifstream f(In);
    ofstream g(Out);
    f >> n >> m >> k;
    for(i = 1 ; i <= m; ++i)
        f >> e[i].x >> e[i].y >> e[i].cost;
    APM();
    for(i = 1;i <= n; ++i)
        if(!niv[i])
            Niv(i);
    for( ;  k; --k)
    {
        f >> X >> Y ;
        sol = 0;
        while(niv[X] > niv[Y])
        {
            sol = max(sol,c[X]);
            X = Father[X];
        }
        while(niv[X] < niv[Y])
        {
            sol = max(sol,c[Y]);
            Y = Father[Y];
        }
        while(X != Y)
        {
            sol = max(sol,max(c[X],c[Y]));
            X = Father[X];
            Y = Father[Y];
        }
        g<<sol<<"\n";
    }
    f.close();
    g.close();
    return 0;
}