Cod sursa(job #1709366)

Utilizator UAIC_The_RobotsUAIC-Tucar-Onesim-Vintur UAIC_The_Robots Data 28 mai 2016 11:58:08
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.25 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;

    scanf("%d %d %d %d", &n, &m, &d, &p);

    for(i = 0; i < m; ++i)
    {
        scanf("%d %d %d %d", &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) printf("%d\n", sol[i]);

    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;
}