https://codeforces.com/contest/920/problem/E

https://www.luogu.org/problemnew/show/P3452

https://www.lydsy.com/JudgeOnline/problem.php?id=1098

CF貌似出了原题?

这几个都是一样的,输入输出都一样,就是读入一张图,要求补图的连通块个数以及各个连通块大小

可以这样搞:维护一个set表示所有当前没到过的点;一开始所有点加进去

取出set中任意点作为起始点并从set中删除,以此为起点进行bfs,直到set为空;则同一次bfs中经过的点是同一个连通块内的

从某个点u开始bfs的时候,就先找出所有原图中与u有边的点v,如果set中还有v就从set中暂时删掉v(记录下哪一些是实际删掉的)

然后当前set中所有点都是u能到达的,暴力加入bfs的队列并从set中删除;处理完这个u后,再向set中加回前面暂时删掉的点

set可以换成链表。。就O(n+m)了

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<list>
#include<queue>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
struct E
{
int to,nxt;
}e[];
int f1[],ne;
list<int> li;
list<int>::iterator it[];
queue<int> q;
int n,m;
int tt[];
int an[];
int main()
{
int i,a,b,t,u,sz,k;
list<int>::iterator i1;
scanf("%d%d",&n,&m);
for(i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
e[++ne].to=b;e[ne].nxt=f1[a];f1[a]=ne;
e[++ne].to=a;e[ne].nxt=f1[b];f1[b]=ne;
}
for(i=;i<=n;i++) it[i]=li.insert(li.end(),i);
while(!li.empty())
{
t=li.front();li.erase(it[t]);it[t]=li.end();
sz=;
q.push(t);
while(!q.empty())
{
u=q.front();q.pop();
sz++;
tt[]=;
for(k=f1[u];k;k=e[k].nxt)
if(it[e[k].to]!=li.end())
{
tt[++tt[]]=e[k].to;
li.erase(it[e[k].to]);
it[e[k].to]=li.end();
}
while(!li.empty())
{
t=li.front();li.erase(it[t]);it[t]=li.end();
q.push(t);
}
for(i=;i<=tt[];i++) it[tt[i]]=li.insert(li.end(),tt[i]);
}
an[++an[]]=sz;
}
sort(an+,an+an[]+);
printf("%d\n",an[]);
for(i=;i<=an[];i++) printf("%d ",an[i]);
return ;
}

好像也可以改成bfs到点u时,就枚举当前set中剩余的所有点v,然后判断(u,v)是否存在于原图中,如果答案为否则将v加入队列,如果用哈希表判断边是否存在则复杂度仍然O(n+m)

最新文章

  1. 3.C#面向对象基础聊天机器人
  2. 云存储的那些事(2)——数据分布算法CRUSH
  3. bringSubviewToFront和insertSubview: atIndex:
  4. JAVA的名词释义
  5. SQL 修改数据库架构名
  6. TCP/IP协议知识科普
  7. Active控件有关问题
  8. 将 Java Spring Framework 应用程序迁移到 Windows Azure
  9. JSON理解
  10. 数据库 用SQL语句操作数据
  11. 路飞学城-Python开发集训-第2章
  12. bus实现兄弟组件传值
  13. python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战
  14. Python之旅Day2 元组 字符串 字典 集合
  15. JavaWeb开发中采用FreeMarker生成Excel表格
  16. 想要进步,就要阅读大神的博客,再推荐一波springmvc映射路径之url的action请求
  17. python工具 - alert弹框输出姓名年龄、求和
  18. ns3的输入输出奥秘(一) LOGGING系统
  19. 【Spring】SpringMVC中浅析数据的传递方式
  20. EBS管理员为供应商创建新联系人流程

热门文章

  1. JavaScript学习第四天
  2. POJ 1611 The Suspects (并查集+数组记录子孙个数 )
  3. HDU2586 How far away? —— 倍增LCA
  4. 关于Zookeeper
  5. BestCoder3 1001 Task schedule(hdu 4907) 解题报告
  6. SSL handshake_decode_error
  7. 【C】貌似不友好的scanf()
  8. bzoj1013高斯消元
  9. MTK touchscreen 流程
  10. 【旧文章搬运】为什么win32k.sys在System进程空间无法访问