Pagini recente » Cod sursa (job #1873525) | Cod sursa (job #1058084) | Cod sursa (job #1218146) | Cod sursa (job #2374208) | Cod sursa (job #2856518)
/// [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 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<int> src(m + 1), dst(m + 1), cost(m + 1), k(m + 1), e(m + 1);
for (int i = 1; i <= m; ++i) {
fin >> src[i] >> dst[i] >> cost[i] >> k[i];
e[i] = i;
}
auto cmp = [&](int a, int b) {
return cost[a] == cost[b] ? k[a] > k[b] : cost[a] < cost[b];
};
sort(e.begin() + 1, e.end(), cmp);
dsu tree;
tree.build(n);
int left = n - 1, i = 0;
while (++i, left) {
if (tree.connected(src[e[i]], dst[e[i]]))
continue;
tree.merge(src[e[i]], dst[e[i]]);
fout << e[i] << nl;
left--;
}
}