Cod sursa(job #1802258)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 10 noiembrie 2016 00:02:34
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");

struct graf
{
    int x,y,c;
};
graf gf[2*15005];
int n, m, k, T[15005], rang[15005], Cost[15005], Use[15005];

inline int caut(int a)
{
    for(;T[a]!=a;a=T[a]);
    return a;
}

inline void Unite(int a, int b, int c)
{
    if(rang[a]<rang[b])
    {
        T[a] = b;
        Cost[a] = c;
    }
    else
    {
        T[b] = a;
        Cost[b] = c;
    }
    if(rang[a] == rang[b]) rang[a]++;
}

inline bool Comp(graf a, graf b)
{
    return a.c<b.c;
}

void arbmin()
{
    for(int i = 1; i <= n; i++) T[i] = i;
    sort(gf+1,gf+1+m,Comp);
    for(int i = 1; i <= m; i++)
    {
        int a = caut(gf[i].x);
        int b = caut(gf[i].y);
        if(a!=b)
        {
            Unite(a, b, gf[i].c);
        }
    }
    //for(int i = 1; i<=n; i++) cout<<T[i]<<' ';
}

inline int LCA(int a, int b, int p)
{
    for(;T[a]!=a;Use[a] = p, a = T[a]);
    for(;T[b]!=b && Use[b]!=p; b = T[b]);
    return b;
}

inline int GetMax(int a, int b)
{
    int cost;
    for(cost = 0; a!=b; cost = max(cost,Cost[a]), a = T[a]);
    return cost;
}

inline int Query(int a, int b, int p)
{
    int l = LCA(a,b,p);
    //cout<<l<<'\n';
    return max(GetMax(a,l), GetMax(b,l));
}

void Solve()
{
    arbmin();
    for(; k > 0; k--)
    {
        int a, b;
        f>>a>>b;
        g<<Query(a,b,k)<<'\n';
    }
}
void Read()
{
    f>>n>>m>>k;
    for(int i = 1; i <= m; i++)
    {
        f>>gf[i].x>>gf[i].y>>gf[i].c;
    }
}

int main()
{
    Read();
    Solve();
    return 0;
}