Cod sursa(job #2856510)

Utilizator amcbnCiobanu Andrei Mihai amcbn Data 23 februarie 2022 22:44:55
Problema Lazy Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
/// [A][M][C][B][N] ///
#include <bits/stdc++.h>
using namespace std;
const int mod = 9973;
const int inf = 0x3f3f3f3f;
const char sp = ' ', nl = '\n';
ifstream fin("lazy.in");
ofstream fout("lazy.out");

struct edge {
    int src, dst, cost, k, idx;
    edge() : src(0), dst(0), cost(0), k(0), idx(0) {}
};

struct dsu {
    vector<int> rt, rnk;
    dsu() {}
    void build(int n) {
        rt.resize(n + 1), rnk.assign(n + 1, 1);
        iota(rt.begin(), rt.end(), 0);
    }
    int find(int x) {
        return rt[x] == x ? x : (rt[x] = find(rt[x]));
    }
    void merge(int x, int y) {
        x = find(x), y = find(y);
        if (x == y) return;
        if (rnk[x] < rnk[y])
            swap(x, y);
        rnk[x] += rnk[y], rnk[y] = 0;
        rt[y] = x;
    }
    bool connected(int x, int y) {
        return find(x) == find(y);
    }
};

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n, m;
    fin >> n >> m;
    vector<edge> v;
    auto cmp = [&](const edge& a, const edge& b) {
        return a.cost == b.cost ? a.k <= b.k : a.cost >= b.cost;
    };
    priority_queue<edge, vector<edge>, decltype(cmp)> pq(cmp);
    edge e;
    for (int i = 0; i < m; ++i) {
        fin >> e.src >> e.dst >> e.cost >> e.k;
        e.idx = i + 1;
        pq.push(e);
    }
    dsu tree;
    tree.build(n);
    for (int i = 1; i < n;) {
        e = pq.top(), pq.pop();
        if (tree.connected(e.src, e.dst))
            continue;
        tree.merge(e.src, e.dst);
        fout << e.idx << nl;
        ++i;
    }
}