Cod sursa(job #1709554)

Utilizator UBB_ABAUBB InczeBakoBeiland UBB ABA UBB_ABA Data 28 mai 2016 12:50:59
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.25 kb
#include <fstream>
#include <utility>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

#define SC second
#define FT first

typedef pair<int, int> PII;
typedef pair< PII, PII > PPII;

vector<int> par,rnk;


int Find(int x){
    int t=x;
    while(t!=par[t]) t=par[t];
    return par[x]=t;
}


void Union(int a, int b){
    int pa = Find(a);
    int pb = Find(b);

    if(rnk[pa]>=rnk[pb]){
        par[pb]=pa;
        if(rnk[pa]==rnk[pb]) rnk[pa]++;
    }
    else{
        par[pa]=pb;
    }
}


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

    int n,m,d,p;
    fin>>n>>m>>d>>p;

    vector< PPII > ed(m);
    for(int i=0;i<m;++i)
        fin >> ed[i].SC.FT >> ed[i].SC.SC >> ed[i].FT.FT >> ed[i].FT.SC;
    sort(ed.begin(), ed.end());

    par.resize(n+1);
    for(int i=0;i<n+1;++i) par[i]=i;
    rnk.resize(n+1,1);


    set<int> peric;

    for(int i=0; i<m; ++i){
        int a = ed[i].SC.FT;
        int b = ed[i].SC.SC;

        if(Find(a)!=Find(b)){
            Union(a,b);
            peric.insert(ed[i].FT.SC);
        }
    }


    set<int>::reverse_iterator rit = peric.rbegin();
    for(int i=0; i<p; ++i){
        if(rit!=peric.rend()){
            fout<<*rit<<'\n';
            ++rit;
        }
    }
}