Cod sursa(job #1709711)

Utilizator liisLIIS-Horia-Vlad-Denis liis Data 28 mai 2016 13:33:43
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.13 kb
#include <vector>
#include <algorithm>
#include <fstream>

#define NMax 250010
#define MMax 500010
using namespace std;

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

struct Edge{
    int n1,n2,t,c;
    bool operator< (const Edge a) const{
        return t != a.t ? t<a.t : c<a.c;
    }
};

Edge e[MMax];

int p[NMax];
vector<int> P;

int _find(int a)
{
    if(p[a]==0)
        return a;
    return (p[a]=_find(p[a]));
}

void _union(int a,int b)
{
    p[_find(a)] = _find(b);
}

void think(Edge a)
{
    if(_find(a.n1)!=_find(a.n2))
    {
        _union(a.n1,a.n2);

        P.push_back(a.c);
    }
}

bool comp(int a,int b)
{
    return a>b;
}

int main()
{
    int n,m,d,x;
    fin>>n>>m>>d>>x;

    for(int i=1;i<=m;i++)
    {
        fin>>e[i].n1>>e[i].n2>>e[i].t>>e[i].c;
    }
    sort(e+1,e+m+1);

    for(int i=1;i<=m;i++)
    {
        think(e[i]);
    }

    sort(P.begin(),P.end(),comp);
    int nr=0;

    for(int i=0; nr<x; i++)
    {
        while(i>0 && P[i]==P[i-1])
            i++;
        fout<<P[i]<<'\n';
        nr++;
    }

    return 0;
}