Pagini recente » Cod sursa (job #199195) | Cod sursa (job #1325572) | Cod sursa (job #450759) | Cod sursa (job #542588) | Cod sursa (job #1709361)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
#define Nmax 250010
#define Mmax 500010
int fth[Nmax];
vector< int > sol;
struct _muchie {int a, b, t, p;} M[Mmax];
bool CMP(const _muchie &m1, const _muchie &m2)
{
if(m1.t != m2.t) return m1.t < m2.t;
return m1.p < m2.p;
}
int find(int);
void unire(int, int);
int main()
{
freopen("politie.in", "r", stdin);
freopen("politie.out", "w", stdout);
int i, n, m, d, p;
cin >> n >> m >> d >> p;
for(i = 0; i < m; ++i)
{
cin >> M[i].a >> M[i].b >> M[i].t >> M[i].p;
}
sort(M, M + m, CMP);
for(i = 0; i < m; ++i)
{
if(find(M[i].a) != find(M[i].b))
{
sol.push_back(M[i].p);
unire(M[i].a, M[i].b);
}
}
sort(sol.rbegin(), sol.rend());
sol.erase(unique(sol.begin(), sol.end()), sol.end());
for(i = 0; i < p; ++i) cout << sol[i] << '\n';
return 0;
}
int find(int a)
{
if(fth[a] == 0) return a;
fth[a] = find(fth[a]);
return fth[a];
}
void unire(int a, int b)
{
a = find(a);
b = find(b);
if((a + b) & 1) fth[a] = b;
else fth[b] = a;
}