专栏文章

题解:P14077 [GESP202509 七级] 连通图

P14077题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minqriun
此快照首次捕获于
2025/12/02 06:49
3 个月前
此快照最后确认于
2025/12/02 06:49
3 个月前
查看原文

思路

算是一道简单的并查集模板题。

题解

因为要使得所有的点之间联通,相当于把 nn 个点划分为若干个不互相联通的块变得联通,而块的数量 - 1 = 需要加的边数量。
具体如何划分块,详见 并查集模板
具体详见代码注释

代码

CPP
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long
#define pii pair <int, int>
#define lc(i) (i << 1)
#define rc(i) (i << 1 | 1)
#define MAXN 100005
#define MAXM 1000005
int mod = 100000007;

int n, m;
int root[MAXN];//root[i]: i 点所在块的根节点

int search(int node) {
	if (root[node] == node)
		return  node;
	return root[node] = search(root[node]);//优化
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);

	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; ++i)//初始化,每一个点为一块
		root[i] = i;
	for (int i = 1; i <= m; ++i) {
		int u, v;
		cin >> u >> v;
		root[search(u)] = root[search(v)];//合并
	}
	int div = 0;//块数量
	for (int i = 1; i <= n; ++i) {
		if (search(i) == i) 
			++div;
	}
	cout << div - 1 << endl;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...