Cod sursa(job #1709487)

Utilizator UPB_CodeJunkiesUPB NAIDEN NICOLICIOIU COTET UPB_CodeJunkies Data 28 mai 2016 12:33:06
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.4 kb
#include <stdio.h>
#include<algorithm>
#include<vector>
#include <set>
#define maxn 250005
#define maxm 500005
using namespace std;

struct edge{int x,y,t,c;} a[maxm];
int n,m,D,P;
int father[maxn],used[maxm];

set<int> arb;
set<int>::iterator it;

vector<int> sol;

bool cmp(edge A,edge B)
{
    if( A.t==B.t ) return A.c<B.c;
    return A.t<B.t;
}

void read()
{
    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);
    }
}

int search(int k)
{
    if( father[k]==k ) return k;
    father[k]=search(father[k]);
    return father[k];
}

void solve()
{
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=n;i++) father[i]=i;


   // for(int i=1;i<=m;i++) printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].t,a[i].c);
    int rx,ry;
    for(int i=1;i<=m;i++)
    {
        rx=search(a[i].x);
        ry=search(a[i].y);

        if( rx!=ry )
        {
            father[rx]=ry;
            sol.push_back(a[i].c);
        }
    }

    sort(sol.begin(),sol.end());
    for(int i=sol.size()-1;i>=0 && P;i--)
    {
        it=arb.find(sol[i]);
        if( it!=arb.end() ) continue;

        arb.insert(sol[i]);
        printf("%d\n",sol[i]);

        P--;
    }
}

int main()
{
    freopen("politie.in","r",stdin);
    freopen("politie.out","w",stdout);

    read();
    solve();

    return 0;
}