Cod sursa(job #2677915)

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

using namespace std;

class InputReader {
  public:
    InputReader() {}
    InputReader(const char *file_name) {
      input_file = fopen(file_name, "r");
      cursor = 0;
      fread(buffer, SIZE, 1, input_file);
    }
    inline InputReader &operator >>(int &n) {
      while(buffer[cursor] < '0' || buffer[cursor] > '9') {
        advance();
      }
      n = 0;
      while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
        n = n * 10 + buffer[cursor] - '0';
        advance();
      }
      return *this;
    }
  private:
    FILE *input_file;
    static const int SIZE = 1 << 17;
    int cursor;
    char buffer[SIZE];
    inline void advance() {
      ++ cursor;
      if(cursor == SIZE) {
        cursor = 0;
        fread(buffer, SIZE, 1, input_file);
      }
    }
};

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

  DSU(int n) : n(n), rank(n, 0), 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 (rank[a] > rank[b]) 
      swap(a, b);
    
    link[a] = b; 
    cost[a] = c;
    rank[b] += (rank[a] == rank[b]);
  }

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

int main() {
  InputReader 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;
}