Cod sursa(job #1709580)

Utilizator UTCN_FrunzaUTCN Lazar Nitu Petruta UTCN_Frunza Data 28 mai 2016 12:56:25
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.93 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

struct nod
{
    int x;
    int y;
    int cat;
    int per;
}muc[500024];

vector<nod> arb;
int t[250024];
int r[250024];

bool fcomp(nod a, nod b)
{
    if(a.cat - b.cat)
    {
        return a.cat < b.cat;
    }

    return a.per < b.per;
}

bool fcomp1(nod a, nod b)
{
    return a.per > b.per;
}

int n,m,d,p;

int findt(int x)
{
    int start  = x;

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

    while(start != t[start])
    {
        int startAux =start;
        start = t[start];
        t[startAux] = x;
    }

    return x;
}

void unionr(int x, int y)
{
    if(r[x] < r[y])
    {
        t[x] = y;
    }
    else
    {
        t[y] = x;
        if(r[x] == r[y])
        {
            r[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", &muc[i].x, &muc[i].y, &muc[i].cat, &muc[i].per);
    }

    sort(muc+1, muc+m+1, fcomp);

    for(int i = 1; i<=n; ++i)
    {
        t[i] = i;
        r[i] = 0;
    }

    for(int i = 1; i<=m; ++i)
    {
        if(findt(muc[i].x) != findt(muc[i].y))
        {
            unionr(findt(muc[i].x), findt(muc[i].y));
            arb.push_back(muc[i]);
        }
    }

    sort(arb.begin(),arb.end(), fcomp1);


    for(int i = 0; i<arb.size(); ++i)
    {
      //  printf("%d %d %d %d\n", arb[i].x, arb[i].y, arb[i].cat, arb[i].per);
        if(p > 0)
        {
            if(arb[i].per != arb[i+1].per)
            {
                printf("%d\n", arb[i].per);
                 --p;
            }
        }
    }

    if(p > 0)
    {
        printf("%d\n", arb[arb.size()-1].per);
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}