求补图联通快数量,使用链表加速的bfs;
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int next[maxn],pre[maxn],head[maxn],t[maxn],tot=0,n,m,ans=0,way[maxn];
struct E{int to,next;E(int to=0,int next=0):to(to),next(next){}}edge[4000005];
void add(int x,int y){
edge[++tot]=E(y,head[x]);head[x]=tot;
edge[++tot]=E(x,head[y]);head[y]=tot;
}
void del(int k){
next[pre[k]]=next[k];
pre[next[k]]=pre[k];
}
void bfs(int x){
queue<int> Q;
Q.push(x);
while(!Q.empty()){
way[ans]++;
int u=Q.front();Q.pop();
for(int i=head[u];i;i=edge[i].next){int v=edge[i].to;t[v]=1;}
for(int i=next[0];i<=n;i=next[i])if(!t[i]){Q.push(i);del(i);}
for(int i=head[u];i;i=edge[i].next){int v=edge[i].to;t[v]=0;}
}
}
int main(){//freopen("in.in","r",stdin);
scanf("%d%d",&n,&m);int x,y;
for(int i=0;i<=n;i++){next[i]=i+1;pre[i+1]=i;}
for(int i=0;i<m;i++){scanf("%d%d",&x,&y);add(x,y);}
for(int i=next[0];i<=n;i=next[0]){
del(i);
ans++,bfs(i);
}
printf("%d\n",ans);
sort(way+1,way+1+ans);
for(int i=1;i<=ans;i++)printf("%d ",way[i]);
}