Cod sursa(job #2677910)

Utilizator retrogradLucian Bicsi retrograd Data 27 noiembrie 2020 18:18:59
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

struct DSU {
  int n;
  vector<int> link, sz, cost;

  DSU(int n) : n(n), sz(n, 1), link(n, -1), cost(n, -1) {}
  
  int find(int a) {
    while (link[a] != -1) 
      a = link[a];
    return a;
  }
  
  void Union(int a, int b, int c) {
    a = find(a); b = find(b);
    if (a == b) return;
    if (sz[a] > sz[b]) 
      swap(a, b);
    
    link[a] = b; 
    cost[a] = c;
    sz[b] += sz[a];
  }

  int Solve(int a, int b) {
    // maximul de pe lantul a-b
    int answer = 0;
    while (a != b) {
      if (sz[a] > sz[b]) swap(a, b);
      answer = max(answer, cost[a]);
      a = link[a];
    }
    return answer;
  }
};

int main() {
  ifstream cin("radiatie.in");
  ofstream cout("radiatie.out");
  
  int n, m, q; cin >> n >> m >> q;
  vector<tuple<int, int, int>> edges;
  for (int i = 0; i < m; ++i) {
    int a, b, c; cin >> a >> b >> c;
    edges.emplace_back(c, a - 1, b - 1);
  }
  
  sort(edges.begin(), edges.end());
  DSU dsu(n);
  for (auto itr : edges) {
    int a, b, c; tie(c, a, b) = itr;
    dsu.Union(a, b, c);
  }

  for (int i = 0; i < q; ++i) {
    int u, v; cin >> u >> v; --u; --v;
    cout << dsu.Solve(u, v) << '\n';
  }
  
  return 0;
}