Cod sursa(job #2138628)

Utilizator LizaSzabo Liza Liza Data 21 februarie 2018 19:49:39
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
const int NMax=15005;
int N,M,k,T[NMax],R[NMax],Cost[NMax],Use[NMax];
struct muchie
{
    int x,y,c;
};
muchie E[2*NMax];


void Read()
{
    fin>>N>>M>>k;
    for(int i=1;i<=M;++i)
    {
        fin>>E[i].x>>E[i].y>>E[i].c;
    }
}

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

int Root(int a)
{
    while(a!=T[a])
    {
        a = T[a];
    }
    return a;
}

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

void arbore()
{
    for(int i=1; i<=N; ++i)
    {
        T[i] = i;
    }
    sort(E+1,E+M+1,Comp);
    for(int i=1; i<=M; i++)
    {
        int a=Root(E[i].x);
        int b=Root(E[i].y);
        if(a!=b)
        {
            Unite(a,b,E[i].c);
        }
    }
}

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

int GetMax(int a, int b)
{
    int cost=0;
    while(a!=b)
    {
        cost=max(cost,Cost[a]);
        a=T[a];
    }
    return cost;
}
int Query(int a, int b, int p)
{
    int l=LCA(a,b,p);
    return max(GetMax(a,l), GetMax(b,l));
}

void Solve()
{
    arbore();
    for(;k>0;k--)
    {
        int a, b;
        fin>>a>>b;
        fout<<Query(a,b,k)<<'\n';
    }
}

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