Pagini recente » Cod sursa (job #1360648) | Cod sursa (job #1689455) | Cod sursa (job #2856164) | Cod sursa (job #2918816) | Cod sursa (job #2923162)
#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;
ll 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;
}