solution-p2097

题解 P2097 【资料分发1】

原题

题意:给定一个无向图,求这个图的连通块数量。

蒟蒻不会Tarjan,懒得打dfs,于是就写了个简单的并查集。

如果起点和终点不在一个集合内,那么就将它们所在的集合合并

一开始将ans设为点数,每次合并将ans-1即可。

ps:不会并查集的同学可以参考这里

代码

// 此处应有头文件
const int N = 1e5 + 10;
int n,m;
int f[N];
int ans;
int find(int x)
{
	if( x == f[x] )
		return x;
	return f[x] = find( f[x] ); // 路径压缩
}
int main()
{
	cin >> n >> m;
	ans = n;
	for(int i = 1;i <= n;i++)
		f[i] = i; // 并查集初始化
	for(int i = 1;i <= m;i++)
	{
		int p,q;
		cin >> p >> q;
		int a = find(p); // p的老大
		int b = find(q); // q的老大
		if(a != b)
		{
			f[a] = b; // 合并集合
			--ans;
		}
	}
	cout << ans << endl;
    return 0;
}

posted @ 2024-03-06 16:55  iorit  阅读(15)  评论(0)    收藏  举报