Cod sursa(job #2769645)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 17 august 2021 01:07:15
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
#define DIM 30005
#define NMAX 15005

using namespace std;

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

struct elem
{
    int x, y, cost;
    bool operator<(const elem& a) const
    {
        return cost < a.cost;
    }
}edges[DIM];
int n, m, q, t[NMAX], cost[NMAX] ,r[NMAX];

int radacina(int a)
{
    if(a == t[a])
        return a;
    return radacina(t[a]);
}

void leaga(int a, int b, int c)
{
    if(r[a] < r[b])
        swap(a, b);
    t[b] = a;
    cost[b] = c;
    if(r[a] == r[b])
        r[a]++;
}

void kruskal()
{
    sort(edges + 1, edges + 1 + m);

    for(int i = 1; i <= n; i++)
        t[i] = i;

    for(int i = 1; i <= m; i++)
    {
        int radx = radacina(edges[i].x);
        int rady = radacina(edges[i].y);
        if(radx != rady)
            leaga(radx, rady, edges[i].cost);
    }
}

int lca(int a, int b)
{
    int maxi = 0;
    while(a != b)
    {
        if(r[a] > r[b])
        {
            maxi = max(maxi, cost[b]);
            b = t[b];
        }
        else
        {
            maxi = max(maxi, cost[a]);
            a = t[a];
        }
    }
    return maxi;
}

int main()
{
    f >> n >> m >> q;

    for(int i = 1; i <= m; i++)
        f >> edges[i].x >> edges[i].y >> edges[i].cost;

    kruskal();

    for(int i = 1; i <= q; i++)
    {
        int x, y;
        f >> x >> y;
        g << lca(x, y) << "\n";
    }


    return 0;
}