Cod sursa(job #1709788)

Utilizator UPB_ShiftMyBitsUPB Mirea Avram Boaca UPB_ShiftMyBits Data 28 mai 2016 13:52:46
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.56 kb
#include <vector>
#include <algorithm>
#include <fstream>
#include <functional>
#include <set>
using namespace std;

const int MAX_N = 250001;

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

int H[MAX_N], T[MAX_N];

struct Comp {
    bool operator() (const tuple<int, int, int>& t1, const tuple<int, int, int>& t2) {
        return get<2>(t1) < get<2>(t2);
    }
};

vector<tuple<int, int, int>> edges[MAX_N];
set<int, greater<int>> ans;

int find(int a) {
    int r = a;

    while (T[r] != r) {
        r = T[r];
    }

    int ret = r;
    int aux;
    r = a;

    while (r != T[r]) {
        aux = T[r];
        T[r] = ret;
        r = aux;
    }

    return ret;
}

void merge(int a, int b) {
    if (H[a] > H[b]) {
        T[b] = a;
    } else {
        T[a] = b;
    }

    H[b] += (H[a] == H[b]);
}

int main() {
    int N, M, D, P;

    fin >> N >> M >> D >> P;

    for (int i = 1; i <= N; ++i) {
        H[i] = 1;
        T[i] = i;
    }

    int x, y, t, c;
    for (int i = 0; i < M; ++i) {
        fin >> x >> y >> t >> c;
        edges[t].emplace_back(x, y, c);
    }

    for (int i = 1; i <= D; ++i) {
        sort(edges[i].begin(), edges[i].end(), Comp());
        for (const auto& edge : edges[i]) {
            int sa = find(get<0>(edge));
            int sb = find(get<1>(edge));

            if (sa != sb) {
                ans.insert(get<2>(edge));
                merge(sa, sb);
            }
        }
    }

    auto it = ans.begin();
    for (int i = 1; i <= P; ++i) {
        fout << *it << '\n';
        ++it;
    }

    fout.close();

    return 0;
}