Cod sursa(job #1709260)

Utilizator UBB_Craciun_Griza_PuscasUBB ATeamHasNoName UBB_Craciun_Griza_Puscas Data 28 mai 2016 11:30:37
Problema Politie Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

const int MAXN = 250100;

struct muchie {
    int x, y;
    int d, p;

    muchie (int _x, int _y, int _d, int _p) {
        x = _x;
        y = _y;
        d = _d;
        p = _p;
    }

};


int n, m, d, p;
vector<muchie> v;

bool cmp(muchie &a, muchie &b) {
    if (a.d == b.d)
        return a.p < b.p;
    return a.d < b.d;
}

int padure[MAXN];

int get_radacina(int nod) {
    if (nod == padure[nod])
        return nod;

    padure[nod] = get_radacina(padure[nod]);
    return padure[nod];
}

void unite(int a, int b) {
    padure[get_radacina(a)] = get_radacina(b);
}

vector<int> pericole;


int main()
{
    fin >> n >> m >> d >> p;

    for (int i = 1; i <= m; ++i) {
        int x, y, d, p;
        fin >> x >> y >> d >> p;

        v.push_back(muchie(x, y, d, p));
    }

    sort (v.begin(), v.end(), cmp);

    for (int i = 0; i <= n; ++i)
        padure[i] = i;

    int maxPericol = 0;

    for (int i = 0; i < v.size(); ++i) {
        muchie nod = v[i];

        if (get_radacina(nod.x) != get_radacina(nod.y)) {
            pericole.push_back(nod.p);
            unite(nod.x, nod.y);
        }

    }

    sort (pericole.begin(), pericole.end(), greater<int>());

    for (int i = 0; (i < pericole.size() - 1 ) && p; ++i) {
        if (pericole[i] != pericole[i + 1]) {
            fout << pericole[i] << "\n";
            --p;
        }
    }

    if (p)
        fout << pericole[pericole.size() - 1] << "\n";

    return 0;
}