Cod sursa(job #3170637)

Utilizator ana_valeriaAna Valeria Duguleanu ana_valeria Data 17 noiembrie 2023 21:18:38
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define NMAX 15000
#define MMAX 30000
#define LOG 20
using namespace std;
ifstream cin ("radiatie.in");
ofstream cout ("radiatie.out");
struct ura
{
    int x, y, c;
};
ura edges[MMAX + 10];
int boss[NMAX + 10], cnt[NMAX + 10], level[NMAX + 10], ancestor[LOG + 10][NMAX + 10], costMax[LOG + 10][NMAX + 10], n, m, q;
vector <pair <int, int>> graph[NMAX + 10];
bool cmp(struct ura &a, struct ura &b)
{
    if (a.c < b.c)
        return true;
    return false;
}
int finalBoss(int node)
{
    if (node == boss[node])
        return node;
    else
        return boss[node] = finalBoss(boss[node]);
}
void join(int node1, int node2)
{
    node1 = finalBoss(node1);
    node2 = finalBoss(node2);
    if (cnt[node1] < cnt[node2])
    {
        cnt[node2] = cnt[node2] + cnt[node1];
        boss[node1] = node2;
    }
    else
    {
        cnt[node1] = cnt[node1] + cnt[node2];
        boss[node2] = node1;
    }
}
void findMST()
{
    for (int node = 1; node <= n; node++)
    {
        boss[node] = node;
        cnt[node] = 1;
    }
    sort(edges + 1, edges + m + 1, cmp);
    for (int i = 1; i <= m; i++)
        if (finalBoss(edges[i].x) != finalBoss(edges[i].y))
        {
            join(edges[i].x, edges[i].y);
            graph[edges[i].x].push_back({edges[i].y, edges[i].c});
            graph[edges[i].y].push_back({edges[i].x, edges[i].c});
        }
}
void dfs(int node, int parent, int cost)
{
    level[node] = level[parent] + 1;
    ancestor[0][node] = parent;
    costMax[0][node] = cost;
    for (const auto &it : graph[node])
        if (it.first != parent)
            dfs(it.first, node, it.second);
}
int query(int x, int y)
{
    if (level[x] < level[y])
        swap(x, y);
    int diff = level[x] - level[y];
    int ans = 0;
    for (int p = LOG; p >= 0; p--)
        if (diff >> p & 1)
        {
            ans = max(ans, costMax[p][x]);
            x = ancestor[p][x];
        }
    if (x == y)
        return ans;
    for (int p = LOG; p >= 0; p--)
        if (ancestor[p][x] != 0 && ancestor[p][y] != 0 && ancestor[p][x] != ancestor[p][y])
        {
            ans = max(ans, max(costMax[p][x], costMax[p][y]));
            x = ancestor[p][x];
            y = ancestor[p][y];
        }
    ans = max(ans, max(costMax[0][x], costMax[0][y]));
    return ans;
}
int main()
{
    cin >> n >> m >> q;
    for (int i = 1; i <= m; i++)
        cin >> edges[i].x >> edges[i].y >> edges[i].c;
    findMST();
    dfs(1, 0, 0);
    for (int p = 1; p <= LOG; p++)
        for (int node = 1; node <= n; node++)
        {
            ancestor[p][node] = ancestor[p - 1][ancestor[p - 1][node]];
            costMax[p][node] = max(costMax[p - 1][node], costMax[p - 1][ancestor[p - 1][node]]);
        }
    for (int i = 1; i <= q; i++)
    {
        int x, y;
        cin >> x >> y;
        cout << query(x, y) << '\n';
    }
    return 0;
}