Cod sursa(job #2028839)

Utilizator osiaccrCristian Osiac osiaccr Data 28 septembrie 2017 19:01:21
Problema Lazy Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("lazy.in");
ofstream fout ("lazy.out");

struct elem {
    int x, y, i;
    unsigned long long c1;
    long long c2;
} v[100001];

int m, n, T[100001], sol[100001], k;

bool cmp (const elem a, const elem b) {
    if (a.c1 != b.c1)
        return a.c1 < b.c1;
    return a.c2 * a.c1 > b.c2 * b.c1;
}

int rad (int x) {
    while (T[x] > 0) {
        x = T[x];
    }
    return x;
}

int main () {
    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        fin >> v[i].x >> v[i].y >> v[i].c1 >> v[i].c2;
        v[i].i = i;
    }

    for (int i = 1; i <= n; i++)
        T[i] = -1;

    sort (v + 1, v + m + 1, cmp);

    for (int i = 1; i <= m; i++) {
        int radx, rady;
        radx = rad (v[i].x);
        rady = rad (v[i].y);
        if (radx == rady)
            continue;
        if (T[radx] < T[rady]) {
            T[radx] += T[rady];
            T[rady] = radx;
        }
        else {
            T[rady] += T[radx];
            T[radx] = rady;
        }
        sol[++k] = v[i].i;
    }

    for (int i = 1; i <= k; i++) {
        fout << sol[i] << "\n";
    }

    return 0;
}