Cod sursa(job #1709869)

Utilizator ALL10iUPB ALL10i ALL10i Data 28 mai 2016 14:13:53
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.3 kb
#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;
}