codeforces 1242B 0-1 MST 【图论+并查集】

题目分析

要求最小生成树,如果考虑有0 边相连的点作为一个集合的话,那么就是求集合的个数

那么我们怎么统计 有 0边相邻的点呢?

很显然不能再原图上直接暴力跑。因为随着n的增大,补图会非常大。

但是我们用并查集维护集合的个数

那么我们考虑一个点u ,遍历与u相邻的所有小于u的点,统计u与这个点所在的集合相连的数量

比如 1,2,3 是一个集合 6 与1,2,相连,那么1,2,3 这个集合的数量为3,6只与其中两个点相连接,所以6就可以加入到这个集合中。

这样不断的维护集合和集合中元素的个数就行了。

代码详解

#include 
using namespace std;
const int maxn = 1e5+50;
const int mod =1e9+7;
typedef long long ll;
vectorG[maxn];
int fa[maxn];
int sz[maxn];
mapmp;
void init()
{
	for(int i=0;i>n>>m;	
	init();
	for(int i=1;i<=m;i++) 
	{
		int u,v; cin>>u>>v;
		addedge(u,v);
	}
	vectorgp;
	for(int i=1;i<=n;i++)
	{
		sz[i] = 1;
		mp.clear();
		int tot = 0; 
		//cout<=i) continue;
			int fv = findset(v);
			//cout< "<mp[t])
			{
				unin(i,t);
			}
		}
		int fx = findset(i);
		if(fx==i) gp.push_back(fx);
	}
	int cnt =0;
	for(int i=1;i<=n;i++)
	{
		 if(fa[i]==i) cnt++;
	} 
	cout<

你可能感兴趣的:(图论,并查集)