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

首先,没有连边的人一定得在一个连通块里;

先把所有人连成一个链表,然后从第一个人开始,把和它有连边的人都打上标记,没有标记的就加入栈里,并在链表中删除;

只要栈里还有值,就重复这个操作,把必须和栈顶元素在一个连通块的元素也都找出来加入栈,同时 siz++;

因为链表维护,所以遍历人的复杂度总体是 O(n) 的,再加上遍历边的复杂度,算下来是 O(n+m);

关键在于用链表降低遍历人的复杂度!很好的思路。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=1e5+,xm=2e6+;
int n,m,hd[xn],ct,to[xm<<],nxt[xm<<],vis[xn],pr[xn],nt[xn],siz[xn],cnt;
int sta[xn],top;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void del(int x){nt[pr[x]]=nt[x]; pr[nt[x]]=pr[x];}
int main()
{
n=rd(); m=rd();
for(int i=,x,y;i<=m;i++)
{
x=rd(); y=rd();
add(x,y); add(y,x);
}
for(int i=;i<=n;i++)pr[i]=i-,nt[i]=i+;
int i=; nt[]=; pr[n+]=n;
while(nt[]!=n+)
{
i=nt[]; del(i);
for(int j=hd[i];j;j=nxt[j])vis[to[j]]=i;
sta[++top]=i; siz[++cnt]=;
while(top)
{
int x=sta[top]; top--;
for(int k=hd[x];k;k=nxt[k])vis[to[k]]=x; vis[x]=x;
int nww=nt[];
while(nww!=n+)
{
if(vis[nww]!=x)siz[cnt]++,sta[++top]=nww,del(nww);
nww=nt[nww];
}
}
}
printf("%d\n",cnt);
sort(siz+,siz+cnt+);
for(int i=;i<=cnt;i++)printf("%d ",siz[i]);
return ;
}

最新文章

  1. InventSumDelta表的作用
  2. js 后台弹窗
  3. [Java] Tcp/udp 简单通信
  4. jquery读取本地文件
  5. 根据input 标签取value属性的值
  6. 调整Tomcat的并发线程到5000+
  7. Linux下执行ls命令提示CMake Error错误
  8. [转]同一台Windows机器中启动多个Memcached服务
  9. Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串
  10. c++ 中的智能指针实现
  11. java框架篇---hibernate(多对多)映射关系
  12. python--json串相关的loads dumps load dump
  13. 【Linux】-NO.6.Linux.2.JDK.1.001-【CentOS 7 Install JDK 8u121】-
  14. Python操作Influxdb数据库
  15. Nodejs+mysql+Express: 一个简单的博客
  16. Codeforces 623B Array GCD
  17. PS快速制作下雪效果
  18. Bof基础实践
  19. 分布式文件系统---GlusterF
  20. .net core +mysqlSugar(最为简单的增删改查)

热门文章

  1. C# 多线程小试牛刀
  2. 利用systemtap定位ifconfig dropped数据包的原因
  3. 【spring boot jpa】hql语句报错 :antlr.NoViableAltException: unexpected token: roleName
  4. 带您了解Oracle层次查询
  5. [转]Linux上程序执行的入口--Main
  6. 函数柯里化 curry
  7. 【leetcode】 26. Remove Duplicates from Sorted Array
  8. opencvSGBM半全局立体匹配算法的研究(1)
  9. 2016-1-8 windows 7下安装mysql及其配置和运用
  10. Go语言测试代码