Cod sursa(job #2392632)

Utilizator alexilasiAlex Ilasi alexilasi Data 30 martie 2019 11:17:18
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nMax = 20010;

struct muchie {int x, y, c;};

int n, m, k, i, a, b;
int t[nMax], h[nMax], c[nMax];
muchie v[nMax];

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

int getTata(int nod) {
    if (t[nod] != t[t[nod]])
        return getTata(t[nod]);
    return t[nod];
}

void unite(int a, int b, int val)
{
    a = getTata(a); b = getTata(b);
    if(a == b) return;

    if(h[a] < h[b])
    {
        t[a] = b;
        c[a] = val;
    }
    else
    {
        if(h[a] == h[b])
            ++h[a];
        t[b] = a;
        c[b] = val;
    }
}

int solve(int a, int b)
{
    int ans = 0;
    while(a != b)
    {
        if(h[a] < h[b])
        {
            ans = max(ans, c[a]);
            a = t[a];
        }
        else
        {
            ans = max(ans, c[b]);
            b = t[b];
        }
    }
    return ans;
}

int main()
{
    fin >> n >> m >> k;
    for(i=1; i<=n; i++)
        fin >> v[i].x >> v[i].y >> v[i].c;
    for(i=1; i<=n; i++)
        t[i] = i;
    sort(v+1, v+n+1, cmp);
    for(i=1; i<=n; i++)
        unite(v[i].x, v[i].y, v[i].c);
    while(k--)
    {
        fin >> a >> b;
        fout << solve(a, b) << '\n';
    }
    return 0;
}