Cod sursa(job #2923160)

Utilizator AztecaVlad Tutunaru 2 Azteca Data 11 septembrie 2022 21:36:27
Problema Lazy Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using ll = long long;

const int MAX_N = 2 * 1e5;

int a[MAX_N + 1], parent[MAX_N + 1], cnt[MAX_N + 1];

struct Edge {
  int u;
  int v;
  ll c1;
  ll c2;
  int ind;

  bool operator < (const Edge &other) {
    if (c1 == other.c1) {
      return other.c2 < c2;
    }
    return c1 < other.c1;
  }
};

std::vector<Edge> edges;

void init(int n) {
  for (int i = 1; i <= n; i++) {
    parent[i] = i;
    cnt[i] = 1;
  }
}

int jump(int v) {
  if (v == parent[v]) {
    return v;
  }
  return parent[v] = jump(parent[v]);
}

void unite(int u, int v) {
  u = jump(u);
  v = jump(v);
  if (u != v) {
    if (cnt[u] < cnt[v]) {
      std::swap(u, v);
    }
    parent[v] = u;
    cnt[u] += cnt[v];
  }
}

int main() {
  std::ifstream fin("lazy.in");
  std::ofstream fout("lazy.out");
  int n, m;
  fin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int a, b, c1, c2;
    fin >> a >> b >> c1 >> c2;
    edges.push_back(Edge {a, b, c1, c2, i});
  }
  std::sort(edges.begin(), edges.end());
  init(n);
  for (Edge e : edges) {
    if (jump(e.u) != jump(e.v)) {
      unite(e.u, e.v);
      fout << e.ind << "\n";
    }
  }
  return 0;
}