Pagini recente » Cod sursa (job #1055790) | Cod sursa (job #1111607) | Cod sursa (job #616057) | Cod sursa (job #1946533) | Cod sursa (job #1709293)
#include <fstream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <functional>
#include <utility>
#include <cstdio>
using namespace std;
struct Muchie{
int x, y;
int tip, danger;
};
inline bool cmp(const Muchie& m1, const Muchie& m2){
if (m1.tip != m2.tip) return m1.tip < m2.tip;
return m1.danger < m2.danger;
}
Muchie e[500005];
int t[500005];
set<int, greater<int> > costs;
int grupa(int x){
int aux = x;
while (t[x] != x){
x = t[x];
}
int tt;
while (t[aux] != x){
tt = t[aux];
t[aux] = x;
aux = tt;
}
return x;
}
void unite(int x, int y){
t[grupa(x)] = t[grupa(y)];
}
int main()
{
//ios_base::sync_with_stdio(false);
freopen("politie.in", "r", stdin);
freopen("politie.out", "w", stdout);
int n, m, d, p;
scanf("%d %d %d %d", &n, &m, &d, &p);
for (int i = 0; i < m; ++i){
scanf("%d %d %d %d", &e[i].x, &e[i].y, &e[i].tip, &e[i].danger);
}
for (int i = 0; i <= n; ++i){
t[i] = i;
}
sort(e, e + m, cmp);
int cnt = 0;
for (int i = 0; cnt < n-1; ++i){
if (grupa(e[i].x) != grupa(e[i].y)){
unite(e[i].x, e[i].y);
costs.insert(e[i].danger);
++cnt;
}
}
for (set<int> :: iterator it = costs.begin(); it != costs.end() && p; ++it){
printf("%d\n", *it);
--p;
}
return 0;
}