Cod sursa(job #3195280)

Utilizator gianiferSpita Alexandru-Mihai gianifer Data 20 ianuarie 2024 12:57:58
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define N_MAX 15005
using namespace std;

ifstream fin("radiatie.in");

ofstream fout("radiatie.out");

struct muchie
{
    int x, y, cost;
} v[2 * N_MAX];

int tata[N_MAX], lng[N_MAX], niv[N_MAX], d[N_MAX];
bool viz[N_MAX];
vector<int> l[N_MAX];
int n, m, radacina_finala;

bool compara(muchie a, muchie b)
{
    return a.cost < b.cost;
}

int getroot(int x)
{
    while (tata[x] != x)
        x = tata[x];
    return x;
}
void join(int a, int b, int c)
{
    a = getroot(a);
    b = getroot(b);
    if (lng[a] < lng[b])
        swap(a, b);
    tata[b] = a;
    lng[a] += lng[b];
    d[b] = c;
    l[a].push_back(b);
    radacina_finala = a;
}
void dfs(int nod, int nv)
{
    viz[nod] = true;
    niv[nod] = nv;
    for (int i = 0; i < l[nod].size(); i++)
    {
        int fiu = l[nod][i];
        if (!viz[fiu])
        {
            dfs(fiu, nv + 1);
        }
    }
}
int LCA(int x, int y)
{
    int maxim_x = 0, maxim_y = 0;
    if (niv[x] < niv[y])
        swap(x, y);
    while (niv[x] != niv[y])
    {
        maxim_x = max(maxim_x, d[x]);
        x = tata[x];
    }
    while (x != y)
    {
        maxim_x = max(maxim_x, d[x]);
        maxim_y = max(maxim_y, d[y]);
        x = tata[x];
        y = tata[y];
    }
    return max(maxim_x, maxim_y);
}
int main()
{
    int t;
    fin >> n >> m >> t;
    for (int k = 1; k <= m; k++)
    {
        int i, j, cost;
        fin >> i >> j >> cost;
        v[k] = {i, j, cost};
    }
    for (int i = 1; i <= n; i++)
        tata[i] = i, lng[i] = 1;
    sort(v + 1, v + m + 1, compara);
    for (int i = 1; i <= m; i++)
    {
        if (getroot(v[i].x) != getroot(v[i].y))
        {
            join(v[i].x, v[i].y, v[i].cost);
        }
    }
    dfs(radacina_finala, 1);
    while (t--)
    {
        int a, b;
        fin >> a >> b;
        fout << LCA(a, b) << '\n';
    }
}