LuoguP2097 资料分发1 题解

Content

有一些电脑,一部分电脑有双向数据线连接。如果一个电脑得到数据,它可以传送到的电脑都可以得到数据。现在,你有这个数据,问你至少将其输入几台电脑,才能使所有电脑得到数据。

数据范围:\(n\leqslant 10^5,m\leqslant 2\times 10^5\)

Solution

稍微观察以后就会明白这是一道经典的并查集题目,我们只需要通过并查集将两个电脑所在的联通快合并,最后看有多少个联通块就好了。

Code

int f[100007], n, m, vis[100007], ans;

inline int getfa(int x) {
	return x == f[x] ? x : f[x] = getfa(f[x]);
}
inline void unionn(int x, int y) {
	x = getfa(x), y = getfa(y);
	if(x != y) f[y] = x;
}

int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i) f[i] = i;
	for(int i = 1; i <= m; ++i) {
		int a, b;
		scanf("%d%d", &a, &b);
		unionn(a, b);
	}
	for(int i = 1; i <= n; ++i) if(!vis[getfa(i)]) ans++, vis[getfa(i)] = 1;
	printf("%d", ans);
	return 0;
}
posted @ 2021-12-16 14:54  Eason_AC  阅读(35)  评论(0)    收藏  举报