Cod sursa(job #2785155)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 18 octombrie 2021 08:21:20
Problema Politie Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("politie.in");
ofstream fout("politie.out");

const int MAXN = 2e5 + 5e4;
const int MAXM = 5e5;
int wt[1 + MAXN];

struct edge {
  int u, v, w1, w2;

  bool operator < (const edge &A) const {
    if (w1 != A.w1) {
      return w1 < A.w1;
    }
    return w2 < A.w2;
  };
} edges[1 + MAXM];

struct DSU {
  vector<int> p, sz;

  DSU(int n) {
    p.resize(n + 1);
    iota(p.begin(), p.end(), 0);
    sz.assign(n + 1, 1);
  }

  int root(int x) {
    if (x == p[x]) {
      return x;
    }
    return p[x] = root(p[x]);
  }

  bool unite(int u, int v) {
    int x = root(u), y = root(v);
    if (x == y) {
      return false;
    }
    if (sz[y] < sz[x]) {
      swap(x, y);
    }
    p[x] = y;
    sz[y] += sz[x];
    return true;
  }
};

void test_case() {
  int n, m, d, p;
  fin >> n >> m >> d >> p;
  for (int i = 1; i <= m; ++i) {
    int u, v, w1, w2;
    fin >> u >> v >> w1 >> w2;
    edges[i] = {u, v, w1, w2};
  }
  sort(edges + 1, edges + m + 1);
  int q = 0;
  DSU t(n);
  for (int i = 1; i <= m; ++i) {
    if (t.unite(edges[i].u, edges[i].v)) {
      wt[++q] = edges[i].w2;
    }
  }
  sort(wt + 1, wt + q + 1, greater<int>());
  for (int i = 1; i <= q && p >= 1; ++i) {
    if (wt[i] != wt[i - 1]) {
      fout << wt[i] << '\n';
      --p;
    }
  }
}

int main() {
  int t = 1;
  for (int tc = 1; tc <= t; ++tc) {
    test_case();
  }
  fin.close();
  fout.close();
  return 0;
}