Cod sursa(job #1709361)

Utilizator UAIC_The_RobotsUAIC-Tucar-Onesim-Vintur UAIC_The_Robots Data 28 mai 2016 11:56:17
Problema Politie Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
#define Nmax 250010
#define Mmax 500010

int fth[Nmax];
vector< int > sol;

struct _muchie {int a, b, t, p;} M[Mmax];
bool CMP(const _muchie &m1, const _muchie &m2)
{
    if(m1.t != m2.t) return m1.t < m2.t;
    return m1.p < m2.p;
}

int find(int);
void unire(int, int);

int main()
{
    freopen("politie.in", "r", stdin);
    freopen("politie.out", "w", stdout);

    int i, n, m, d, p;

    cin >> n >> m >> d >> p;

    for(i = 0; i < m; ++i)
    {
        cin >> M[i].a >> M[i].b >> M[i].t >> M[i].p;
    }

    sort(M, M + m, CMP);

    for(i = 0; i < m; ++i)
    {
        if(find(M[i].a) != find(M[i].b))
        {
            sol.push_back(M[i].p);
            unire(M[i].a, M[i].b);
        }
    }

    sort(sol.rbegin(), sol.rend());
    sol.erase(unique(sol.begin(), sol.end()), sol.end());

    for(i = 0; i < p; ++i) cout << sol[i] << '\n';

    return 0;
}

int find(int a)
{
    if(fth[a] == 0) return a;

    fth[a] = find(fth[a]);
    return fth[a];
}

void unire(int a, int b)
{
    a = find(a);
    b = find(b);

    if((a + b) & 1) fth[a] = b;
    else fth[b] = a;
}