Pagini recente » Cod sursa (job #1730766) | Cod sursa (job #2902938) | Cod sursa (job #2954883) | Cod sursa (job #2938148) | Cod sursa (job #2785155)
#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;
}