Cod sursa(job #1016302)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 26 octombrie 2013 00:26:38
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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);
           Tree[Y].push_back(X);
           c[X] = e[i].cost;
        }
    }
}

inline void DFS(const int node,const int Niv)
{
    niv[node] = Niv;
    for(vector < int > ::iterator it=Tree[node].begin(); it!= Tree[node].end() ;++it)
        DFS(*it,Niv+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(Father[i] == i)
        {
            DFS(i,0);
            break;
        }
    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;
}