Cod sursa(job #1709235)

Utilizator PlayHPPet Rescue PlayHP Data 28 mai 2016 11:24:28
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.41 kb
#include<cstdio>
#include<algorithm>
#include<set>
#define MAXM 500010
#define MAXN 250010
using namespace std;
struct edge{int x,y,t,c;};
edge edges[MAXM];
int h[MAXN],dad[MAXN];
set<int> solution;
set<int>::iterator it;
bool cmp(edge a,edge b){
    if(a.t<b.t)
        return true;
    if(a.t>b.t)
        return false;
    if(a.c<b.c)
        return true;
    return false;
}
int findDad(int node){
    if(dad[node]==node)
        return node;
    return dad[node]=findDad(dad[node]);
}
int main(){
    freopen("politie.in","r",stdin);
    freopen("politie.out","w",stdout);
    int n,m,d,p,i,x,y,dadx,dady;
    scanf("%d%d%d%d",&n,&m,&d,&p);
    for(i=1;i<=n;i++){
        dad[i]=i;
        h[i]=1;
    }
    for(i=1;i<=m;i++)
        scanf("%d%d%d%d",&edges[i].x,&edges[i].y,&edges[i].t,&edges[i].c);
    sort(edges+1,edges+m+1,cmp);
    for(i=1;i<=m;i++){
        x=edges[i].x;
        y=edges[i].y;
        dadx=findDad(x);
        dady=findDad(y);
        if(dadx==dady)
            continue;
        solution.insert(-edges[i].c);
        if(h[dadx]>h[dady])
            dad[dady]=dadx;
        else
            if(h[dadx]<h[dady])
                dad[dadx]=dady;
            else{
                dad[dady]=dadx;
                h[dadx]++;
            }
    }
    for(it=solution.begin(),i=1;it!=solution.end()&&i<=p;i++,it++)
        printf("%d\n",-*it);
    return 0;
}