Cod sursa(job #1900974)

Utilizator prazillaPrazilla prazilla Data 3 martie 2017 18:02:54
Problema Politie Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.82 kb
#include<stdio.h>
#include<algorithm>
#define MAX 500001
#define MBX 250001
using namespace std;

FILE *f1 = fopen("politie.in", "r");
FILE *f2 = fopen("politie.out", "w");

int n, m, d, p, i, j, nr, t1, t2, v[MBX], h[MBX], nrsol;

struct muchii
{
    int a, b, pericol, grad;
}muchie[MAX], m2[MAX];

int comp(muchii a, muchii b)
{
    if (a.grad < b.grad) return 1;
    if (a.grad == b. grad && a.pericol < b.pericol) return 1;
    return 0;
}

int padre(int x)
{
    int t = x, aux;
    while(v[t] != 0)
        t = v[t];
    while (x != t)
    {
        aux = v[x];
        v[x] = t;
        x = aux;
    }
    return t;
}

void insieme(int x, int y)
{
    if (h[x] < h[y])
        v[x] = y;
    else if (h[x] > h[y])
        v[y] = x;
    else
    {
        v[y] = x;
        h[x]++;
    }
}

int comp2(muchii a, muchii b)
{
    if (a.pericol > b.pericol)
        return 1;
    return 0;
}

int main()
{
    fscanf(f1, "%d%d%d%d", &n, &m, &d, &p);
    for (i = 1; i <= m; i++)
        fscanf(f1, "%d%d%d%d", &muchie[i].a, &muchie[i].b, &muchie[i].grad, &muchie[i].pericol);
    sort(muchie + 1, muchie + m + 1, comp);
    nr = 1;
    for (i = 1; i <= n - 1; i++)
    {
        t1 = padre(muchie[nr].a);
        t2 = padre(muchie[nr].b);
        while (t1 == t2)
        {
            nr++;
            t1 = padre(muchie[nr].a);
            t2 = padre(muchie[nr].b);
        }
        nrsol++;
        m2[nrsol] = muchie[nr];
        insieme(t1, t2);
    }
    sort(m2 + 1, m2 + nrsol + 1, comp2);
    t1 = -1; t2 = 0;
    for (i = 1; i <= nrsol; i++)
        if (t1 != m2[i].pericol)
        {
            fprintf(f2, "%d\n", m2[i].pericol);
            t2++;
            if (t2 == p)
                break;
            t1 = m2[i].pericol;
        }
    return 0;
}