Pagini recente » Cod sursa (job #1130463) | Cod sursa (job #726371) | Cod sursa (job #2327561) | Cod sursa (job #492976) | Cod sursa (job #1709722)
#include <vector>
#include <fstream>
#include <functional>
#include <set>
using namespace std;
const int MAX_N = 250001;
ifstream fin("politie.in");
ofstream fout("politie.out");
int H[MAX_N], T[MAX_N];
struct Comp {
bool operator() (const tuple<int, int, int>& t1, const tuple<int, int, int>& t2) {
return get<2>(t1) < get<2>(t2);
}
};
multiset<tuple<int, int, int>> edges[MAX_N];
set<int, greater<int>> ans;
int find(int a) {
int r = a;
while (T[r] != r) {
r = T[r];
}
int ret = r;
int aux;
r = a;
while (r != T[r]) {
aux = T[r];
T[r] = ret;
r = T[r];
}
return ret;
}
int merge(int a, int b) {
if (H[a] > H[b]) {
T[b] = a;
} else {
T[a] = b;
}
H[b] += (H[a] == H[b]);
}
int main() {
int N, M, D, P;
fin >> N >> M >> D >> P;
for (int i = 1; i <= N; ++i) {
H[i] = 1;
T[i] = i;
}
int x, y, t, c;
for (int i = 0; i < M; ++i) {
fin >> x >> y >> t >> c;
edges[t].insert(make_tuple(x, y, c));
}
for (int i = 1; i <= D; ++i) {
for (const auto& edge : edges[i]) {
int sa = find(get<0>(edge));
int sb = find(get<1>(edge));
if (sa != sb) {
ans.insert(get<2>(edge));
merge(sa, sb);
}
}
}
auto it = ans.begin();
for (int i = 1; i <= P; ++i) {
fout << *it << '\n';
++it;
}
return 0;
}