Cod sursa(job #2137517)

Utilizator mariastStoichitescu Maria mariast Data 20 februarie 2018 20:45:41
Problema Politie Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.12 kb
#include<cstdio>
#include<algorithm>
using namespace std;

struct muchie{
    int x,y,t,c;
}a[500010];
int sol[500010],P[250010],t[250010],n,m,d,p;
bool cmp(muchie A,muchie B){
    return ((A.t<B.t)||(A.t==B.t&&A.c<B.c));
}
int root(int x){
    while(x!=t[x]) x=t[x];
    return x;
}
void unifica(int x,int y){
    if(P[x]>P[y]) t[y]=x;
    if(P[x]<P[y]) t[x]=y;
    if(P[x]==P[y]){
        t[y]=x;
        P[x]++;
    }
}
int main()
{
    freopen("politie.in","r",stdin);
    freopen("politie.out","w",stdout);

    scanf("%d%d%d%d",&n,&m,&d,&p);
    for(int i=1;i<=m;++i)
        scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].t,&a[i].c);
    for(int i=1;i<=n;++i) t[i]=i;
    sort(a+1,a+m+1,cmp);
    int k=0,i=1;
    while(k<n-1){
        int rx=root(a[i].x);
        int ry=root(a[i].y);
        if(rx!=ry){
            sol[++k]=a[i].c;
            unifica(rx,ry);
        }
        ++i;
    }
    sort(sol+1,sol+k+1);
    i=k-1;
    printf("%d\n",sol[k]);
    --p;
    while(p){
        if(sol[i]!=sol[i+1]){
            printf("%d\n",sol[i]);
            --p;
        }
        --i;
    }
}