Codeforces - 920E - Connected Components?
bfs,不过要维护一个剩余点的链表,每次从链表里找有边的点然后push。
复杂度比较玄学。。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+7;
vector<int> no[N];
int nxt[N],pre[N],noe[N];
bool vis[N];
vector<int> ans;
void del(int u)
{
nxt[pre[u]]=nxt[u];
pre[nxt[u]]=pre[u];
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;++i)
{
int u,v;
scanf("%d%d",&u,&v);
no[u].push_back(v);
no[v].push_back(u);
}
nxt[0]=1;
pre[n+1]=n;
for(int i=1;i<=n;++i)
nxt[i]=i+1,pre[i]=i-1;
for(int i=1;i<=n;++i)
{
if(vis[i]) continue;
vis[i]=true;
del(i);
queue<int> q;
q.push(i);
int res=0;
while(!q.empty())
{
int u=q.front();q.pop();
++res;
//标记与u没边的点
for(int v : no[u])
{
noe[v]=true;
}
for(int j=nxt[0];j<=n;j=nxt[j])
{
//有边就进队列。
if(!noe[j])
{
del(j);
vis[j]=true;
q.push(j);
}
//没边置0,下一次用。
noe[j]=0;
}
}
ans.push_back(res);
}
printf("%d\n",(int)ans.size());
sort(ans.begin(), ans.end());
for(int i=0;i<ans.size();++i)
printf("%d%c",ans[i],i+1==ans.size()?'\n':' ');
}