Cod sursa(job #2781939)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 11 octombrie 2021 09:11:09
Problema Politie Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <set>
#include <algorithm>
using namespace std;

ifstream fin("politie.in");
ofstream fout("politie.out");
int n,m;
set<int>sol;
struct muchie
{
    int x,y;
    int t,c;
};
muchie a[500005];
int t[300001],h[300001];
int Find(int x) {
	
	if ( t[x] == x)
		return x;
	return t[x] = Find(t[x]);
}
void Union(int i,int j) {
	
	if ( h[i] > h[j])
		t[j] = i;
	else
		{ t[i] = j;
		if ( h[i] == h[j])
			++h[j];
		}
}
inline int cmp(muchie b1,muchie b2)
{
    if(b1.t<b2.t)
        return 1;
     if(b1.t==b2.t and b1.c < b2.c)
			return 1;
    return 0;
}
int main()
{
    int i,nr=0,v1,v2,x1,x2,ct=0,s=0,d,p;
fin>>n>>m >> d >> p;
for(i=1;i<=m;i++)
    fin>>a[i].x>>a[i].y>>a[i].t>>a[i].c;
sort(a+1,a+m+1,cmp);
for(i=1;i<=n;i++)
    t[i]=i;
i=1;
ct=0;
nr=0;
int bagat = 0;
while(nr<n-1)
{
    v1=a[i].x;
    v2=a[i].y;
    x1=Find(v1);
    x2=Find(v2);
    if(x1!=x2)
    {
     nr++;
     ct++;
     ct++;
     if(sol.size() < p)
     sol.insert(-a[i].c);
	
     Union(x1,x2);
    }
    i++;
}
i=1;
for ( auto it : sol) {
	fout << -it << "\n";
}
    return 0;
}