Cod sursa(job #2833092)

Utilizator cdenisCovei Denis cdenis Data 14 ianuarie 2022 18:29:27
Problema Politie Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("politie.in");
ofstream fout("politie.out");

const int MAX=500005;
int n,m,d,p,cnt,t[MAX],rang[MAX],per[MAX],last;
struct T{int a,b,cat,per;}v[MAX];
bool cmp(T x, T y)
{
    if(x.cat==y.cat)
        return x.per<y.per;
    return x.cat<y.cat;
}

int root(int x)
{
    while(x!=t[x])
        x=t[x];
    return x;
}

void uneste(int x, int y)
{
    if(rang[x]>rang[y])
        t[y]=x;
    if(rang[y]>rang[x])
        t[x]=y;
    if(rang[x]==rang[y])
    {
        t[y]=x;
        rang[x]++;
    }
}

int main()
{
    fin >> n >> m >> d >> p;
    for(int i=1;i<=m;i++)
        fin >> v[i].a >> v[i].b >> v[i].cat >> v[i].per;
    for(int i=1;i<=n;i++)
        t[i]=i;
    sort(v+1,v+m+1,cmp);
    for(int i=1;cnt<n-1;i++)
    {
        int rx=root(v[i].a);
        int ry=root(v[i].b);
        if(rx!=ry)
        {
            per[++cnt]=v[i].per;
            uneste(rx,ry);
        }
    }
    sort(per+1,per+n);
    for(int i=n-1,j=p;j;i--)
        if(per[i]!=last)
        {
            fout << per[i] << '\n';
            last=per[i];
            j--;
        }
	return 0;
}