本文共 1215 字,大约阅读时间需要 4 分钟。
#include#include #include using namespace std;// 代码开始vector G[N], b(N, 0);int find(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x];}int main() { int n, m, k; scanf("%d %d", &n, &m); for (int i = 1; i <= n; ++i) p[i] = i; for (int i = 1; i <= m; ++i) { int x, y; scanf("%d %d", &x, &y); G[x].push_back(y); G[y].push_back(x); } int sum = n - k; for (int i = 1; i <= k; ++i) { int a; scanf("%d", &a); b[a] = 1; } for (int i = 1; i <= n; ++i) { if (b[i]) continue; for (int j = 0; j < G[i].size(); ++j) { int v = G[i][j]; if (find(v) != i && !b[v]) { sum--; p[find(v)] = i; } } } for (int i = k; i <= n; ++i) { ans[i] = sum; sum++; b[a[i]] = 0; for (int j = 0; j < G[i].size(); ++j) { int v = G[i][j]; if (find(v) != i && b[v]) { b[v] = 0; } } }}
这段代码实现了并查集(Union-Find)算法,用于处理图中的连通性问题。主要步骤包括:
代码采用了路径压缩和按秩合并优化技术,确保了并查集操作的高效性。
转载地址:http://utufk.baihongyu.com/