Cod sursa(job #2544005)

Utilizator sichetpaulSichet Paul sichetpaul Data 11 februarie 2020 18:12:14
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
#define Nmax 30005
using namespace std;

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

int N, M, Q;
vector<int> G[Nmax];
int r[Nmax], h[Nmax], nr[Nmax], lev[Nmax], dad[Nmax], val[Nmax];
struct edge{
   int x, y, c;
};
edge v[Nmax];
bool cmp(edge a, edge b) {
    return a.c < b.c;
}
int root(int curr) {
   while (r[curr]) curr = r[curr];
      return curr;
}

bool vis[Nmax];
void DFS(int node, int father) {
    vis[node] = 1;
    lev[node] = lev[father] + 1;
    dad[node] = father;
    for (auto it: G[node])
      if (!vis[it]) DFS(it, node);
}

int lca(int x, int y) {
    int a = lev[x], b = lev[y], ans = 0;
    while (a > b)
        ans = max(ans, val[x]), x = dad[x], --a;
    while (b > a)
        ans = max(ans, val[y]), y = dad[y], --b;

    while (x != y) {
        ans = max(ans, max(val[x], val[y]));
        x = dad[x];
        y = dad[y];
    }
      return ans;
}
int main()
{
    f >> N >> M >> Q;
    for (int i = 1; i <= M; ++i)
        f >> v[i].x >>v[i].y >> v[i].c;
    sort(v + 1, v + M + 1, cmp);

    for (int i = 1; i <= N; ++i)
       nr[i] = 1;
    for (int i = 1; i <= M; ++i) {
        int rx = root(v[i].x), ry = root(v[i].y);
        if (rx != ry) {
            val[v[i].y] = v[i].c;
            G[v[i].x].push_back(v[i].y);
            G[v[i].y].push_back(v[i].x);
            if (h[rx] >= h[ry]) r[ry] = rx, nr[ry] += nr[rx];
            else r[rx] = ry, nr[rx] += nr[ry];
            if (h[rx] == h[ry]) ++h[rx];
        }
    }
      DFS(1, 0);

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

    return 0;
}