Pagini recente » Cod sursa (job #36853) | Cod sursa (job #142786) | Cod sursa (job #573824) | Cod sursa (job #1073469) | Cod sursa (job #1709869)
#include <algorithm>
#include <stdio.h>
#include <set>
using namespace std;
#define IN "politie.in"
#define OUT "politie.out"
#define MAXN 250010
#define MAXM 500010
struct drum {
int x, y, c, p;
} H[MAXM];
int N, M, D, P, i, cost, ct;
int T[MAXN];
int I[MAXN];
int Sol[MAXN];
int cmp(drum A, drum B) {
if (A.c == B.c) {
return A.p < B.p;
}
return A.c < B.c;
}
int father(int nod) {
while (T[nod])
nod = T[nod];
return nod;
}
struct lex_compare {
bool operator() (const int &lhs, const int &rhs) const{
return lhs > rhs;
}
};
int main() {
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d%d%d%d",&N,&M, &D, &P);
for (i = 1; i <= M; ++i)
scanf("%d%d%d%d",&H[i].x,&H[i].y,&H[i].c, &H[i].p);
sort(H + 1, H + M + 1, cmp);
cost = ct = 0;
int par1, par2;
for (i = 1; i <= M; ++i) {
par1 = father(H[i].x);
par2 = father(H[i].y);
if (par1 != par2)
{
if (I[par1] == I[par2])
I[par2]++;
if (I[par1] <= I[par2])
T[par1] = par2;
else
T[par2] = par1;
cost += H[i].c;
Sol[++ct] = i;
}
}
set<int, lex_compare> pericole;
for (i = 1; i <= ct; ++i) {
pericole.insert(H[Sol[i]].p);
}
for(int i = 0; i < P; i++) {
printf("%d\n", *pericole.begin());
pericole.erase(pericole.begin());
}
return 0;
}