c++代码实现:用并查集解决图论-桥问题
时间: 2023-11-21 16:04:34 浏览: 83
好的,这里提供一份 C++ 代码实现,用并查集解决图论-桥问题:
```c++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
int n, m;
int fa[MAXN], ans[MAXN];
struct Edge {
int u, v, id;
} e[MAXN];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y) {
int fx = find(x), fy = find(y);
if (fx != fy) fa[fx] = fy;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) fa[i] = i;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &e[i].u, &e[i].v);
e[i].id = i;
}
sort(e + 1, e + m + 1, [](Edge a, Edge b) {
return a.u == b.u ? a.v < b.v : a.u < b.u;
});
int cnt = 0;
for (int i = 1, j = 1; i <= m; i++) {
while (j < i && e[j].u < e[i].u - 1) {
merge(e[j].u, e[j].v);
j++;
}
if (find(e[i].u) != find(e[i].v)) {
ans[++cnt] = e[i].id;
merge(e[i].u, e[i].v);
}
}
sort(ans + 1, ans + cnt + 1);
printf("%d\n", cnt);
for (int i = 1; i <= cnt; i++) printf("%d\n", ans[i]);
return 0;
}
```
这里使用了结构体存储边,包括起点、终点、边的编号。首先将边按照起点从小到大排序,对于每条边,如果它的起点和终点不在同一个集合中,说明这条边是桥,将它的编号存入答案数组中,然后合并起点和终点所在的集合。最后按照边的编号从小到大排序,输出答案即可。
希望这份代码能够帮助到你!
阅读全文