Cod sursa(job #1717720)

Utilizator cristina_borzaCristina Borza cristina_borza Data 15 iunie 2016 17:00:21
Problema Politie Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.49 kb
#include <algorithm>
#include <fstream>
#include <vector>
#include <queue>

#define se second
#define fi first

#define INF 1000000000
#define DIM 1000000

using namespace std;

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

pair <pair <int , int> , pair <int , int> > v[DIM];

int tata[DIM] , a[DIM];
int n , m , d , p;

priority_queue <int> sol;

int query (int node) {
    int cp = node;
    while (tata[node] != node) {
        node = tata[node];
    }

    while (cp != node) {
        int aux = tata[cp];
        tata[cp] = node;
        cp = aux;
    }

    return node;
}

void update(int node1 , int node2 , int ind) {
    int p1 = query(node1);
    int p2 = query(node2);

    if (p1 == p2) {
        return;
    }

    if (a[p1] < a[p2]) {
        swap(p1 , p2);
    }

    tata[p2] = p1;
    a[p1] += a[p2];

    int qq = v[ind].fi.se;
    sol.push(qq);
}

int main()  {
    f >> n >> m >> d >> p;
    for (int i = 1; i <= m; ++i) {
        f >> v[i].se.fi >> v[i].se.se >> v[i].fi.fi >> v[i].fi.se;
    }

    sort(v + 1, v + m + 1);
    for (int i = 1; i <= n; ++i) {
        tata[i] = i;
    }

    for (int i = 1; i <= m; ++i) {
        update(v[i].se.fi , v[i].se.se , i);
    }

    int lst = 11;
    for (int i = 1; i <= p; ++i) {
        int qq = sol.top();
        while (!sol.empty() && sol.top() == lst) {
            sol.pop();
        }

        lst = sol.top();
        g << lst << '\n';
    }
    return 0;
}