Pagini recente » Cod sursa (job #3285921) | Cod sursa (job #745566) | Diferente pentru implica-te/arhiva-educationala intre reviziile 162 si 223 | Cod sursa (job #2542338) | Cod sursa (job #1709345)
#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;
}