欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components?(图论+连通块+bfs)

程序员文章站 2023-12-25 18:22:33
...

题目链接
Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components?(图论+连通块+bfs)
题意:给定一个完全图,让你删去m条边后,剩下的连通块个数和每个连通块的大小
思路:可以bfs将属于同一个连通块集的元素放在一起,知道v为空,v是所有的顶点集。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+1;
map<int,int>p[maxn];
vector<int>v,ans;
int bfs(int x)
{
	queue<int>q;
	q.push(x);
	int cnt=0;
	while(!q.empty())
	{
		int top=q.front();
		q.pop();
		cnt++;
		for(int i=0;i<v.size();++i)
		if(!p[top][v[i]])
		{
			int x=v[i];
			q.push(v[i]),swap(v[i],v.back()),v.pop_back(); 
			i--;
		}
	}
	return cnt;
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1,u,v;i<=m;++i) scanf("%d%d",&u,&v),p[u][v]=p[v][u]=1;
	for(int i=1;i<=n;++i) v.push_back(i);
	while(v.size()>0)
	{
		int x=v.back();
		v.pop_back();
		ans.push_back(bfs(x));
	}
	printf("%d\n",ans.size());
	sort(ans.begin(),ans.end());
	for(auto i:ans) printf("%d ",i);
 } 

上一篇:

下一篇: