Cod sursa(job #1708549)

Utilizator neapuiuComisie ICPC UPB neapuiu Data 27 mai 2016 12:29:42
Problema Politie Scor Ascuns
Compilator cpp Status done
Runda Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 250005;
const int MMAX = 500005;

ifstream f("politie.in");
ofstream g("politie.out");

int n, m, d, p, t[NMAX];
vector< pair<long long, pair<int,int> > >edge[NMAX];
set<long long> mySet;

int findRad(int node){
    int node2 = node;
    for(; t[node]!=0; node = t[node]);
    for(; node2!=node; ){
        int temp = t[node2];
        t[node2] = node;
        node2 = temp;
    }
    return node;
}

int unite(int x, int y){
    if (x % 2 == 0)
        t[y] = x;
    else t[x] = y;
}

int main(){
    f >> n >> m >> d >> p;
    for(int i=1; i<=m; ++i){
        int x, y, z, w;
        f >> x >> y >> z >> w;
        edge[z].push_back(make_pair(w, make_pair(x, y)));
    }
    for(int i=1; i<=d; ++i){
        sort(edge[i].begin(), edge[i].end());
    }

    for(int i=1; i<=d; ++i){
        for(int j=0; j<edge[i].size(); ++j){
            int x = edge[i][j].second.first;
            int y = edge[i][j].second.second;
            int radX = findRad(x);
            int radY = findRad(y);
            if (radX == radY) continue;
            unite(radX, radY);
            mySet.insert(edge[i][j].first);
        }
    }

    set<long long>::iterator it = mySet.end();
    --it;
    for(; p; --p){
        g << *it << "\n";
        --it;
    }
    return 0;
}