Cod sursa(job #1709298)

Utilizator echipa_BoSSilorUNIBUC Harsan Bicsi Baltatu echipa_BoSSilor Data 28 mai 2016 11:42:57
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.65 kb
/*************************************************************\
~*********************ENJOY THE SILENCE***********************~
\*************************************************************/

#include <bits/stdc++.h>
using namespace std;

/*******************Debugging defines*************************/

#define ok_dump() cerr<<"OK\n"
#define var_dump(x) cerr<<#x": "<<x<<'\n'
#define arr_dump(x, n) {cerr<<#x"[]: ";\
	for(int _=0;_<n;++_) cerr<<x[_]<<" ";cerr<<'\n';}

/*************************************************************/

struct Edge {
	int u, v, cat, dang;
	Edge(int a, int b, int c, int d) :
		u(a), v(b), cat(c), dang(d) {}
};

int Link[500000];
int Find(int a) {
	if(Link[a]) 
		return Link[a] = Find(Link[a]);
	return a;
}
void Union(int a, int b) {
	Link[Find(a)] = Find(b);
}

set<int> Set;

int main() {	
//	assert(freopen("input.txt", "r", stdin));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	ifstream fin("politie.in");
	ofstream fout("politie.out");

	
	int n, m, d, p;
	fin >> n >> m >> d >> p;

	vector<Edge> Edges;
	Edges.reserve(m);
	while(m--) {
		int a, b, c, d;
		fin >> a >> b >> c >> d;
		Edges.emplace_back(a, b, c, d);
	}

	sort(Edges.begin(), Edges.end(), [](const Edge &a, const Edge &b) {
		if(a.cat == b.cat) return a.dang < b.dang;
		return a.cat < b.cat;
	});

	for(auto &x : Edges) {
		if(Find(x.u) != Find(x.v)) {
			Union(x.u, x.v);
			Set.insert(-x.dang);
		}
	}

	for(auto pr : Set) {
		if(p == 0) return 0;
		fout << -pr << '\n';
		--p;
	}
}

/*************************************************************\
~*********************ENJOY THE SILENCE***********************~
\*************************************************************/