Cod sursa(job #1709345)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 28 mai 2016 11:53:43
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.2 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <set>

#define maxdim 250005

using namespace std;

int n, m, D, P;
int T[maxdim], Rg[maxdim];
vector<pair<pair<int, int>, pair<int, int>>> edges;

int root(int x) {
  int R;
  for (R = x; R != T[R]; R = T[R]);

  while (x != R) {
    int aux = T[x];
    T[x] = R;
    x = aux;
  }

  return R;
}

void unify(int x, int y) {
  if (Rg[x] > Rg[y]) {
    T[y] = x;
  } else {
    T[x] = y;
  }

  if (Rg[x] == Rg[y]) {
    ++Rg[y];
  }
}
 
int main() {
  freopen("politie.in", "r", stdin);
  freopen("politie.out", "w", stdout);

  scanf("%d %d %d %d", &n, &m, &D, &P);
  for (int i = 1; i <= m; ++i) {
    int x, y, d, p; scanf("%d %d %d %d", &x, &y, &d, &p);
    edges.push_back(make_pair(make_pair(d, p), make_pair(x, y)));
  }

  sort(edges.begin(), edges.end());
  for (int i = 1; i <= n; ++i) {
    T[i] = i; Rg[i] = 1;
  }
  set<int> sol;
  for (auto &e : edges) {
    int r1 = root(e.second.first);
    int r2 = root(e.second.second);
    if (r1 != r2) {
      unify(r1, r2);
      sol.insert(-e.first.second);
    }
  }

  set<int>::iterator itt = sol.begin();
  for (int i = 1; i <= P; ++i) {
    printf("%d\n", -(*itt));
    ++itt;
  }

  return 0;
}