Cod sursa(job #2806214)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 14:18:56
Problema Politie Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.53 kb
#include <cstdio>
#include <algorithm>
#define N 250002
#define M 500002

using namespace std;
FILE* f, * g;

struct bla
{
    int x, y, c, p;
}v[M];
bool how(bla A, bla B)
{
    if (A.c != B.c)
        return (A.c < B.c);
    return (A.p < B.p);
}
int tata[N], rang[N], sol[N];

int root(int nod)
{
    while (nod != tata[nod])
        nod = tata[nod];
    return nod;
}

void unite(int ma, int mb)
{
    if (rang[ma] < rang[mb])
        tata[ma] = mb;
    else
        tata[mb] = ma;
    if (rang[ma] == rang[mb])
        ++rang[ma];
}

int main()
{
    f = fopen("politie.in", "r");
    g = fopen("politie.out", "w");
    int cat, k, n, m, a, b, ma, mb;
    fscanf(f, "%d %d %d %d", &n, &m, &cat, &k);
    bla val;
    for (int i = 1;i <= m;++i)
        fscanf(f, "%d %d %d %d", &v[i].x, &v[i].y, &v[i].c, &v[i].p);
    for (int i = 1;i <= n;++i)
        tata[i] = i;
    int nr = 1;
    sort(v + 1, v + m + 1, how);
    for (int i = 1;i <= m;++i)
    {
        val = v[i];
        a = val.x;
        b = val.y;
        ma = root(a);
        mb = root(b);
        if (ma != mb)
        {
            unite(ma, mb);
            sol[++sol[0]] = val.p;
        }
    }
    sort(sol + 1, sol + sol[0] + 1);
    for (int i = sol[0];i >= 1;--i)
        if (nr > k)
        {
            break;
        }
        else
            if (sol[i] != sol[i + 1])
            {
                ++nr;
                fprintf(g, "%d\n", sol[i]);
            }

    fclose(f);
    fclose(g);
    return 0;
}