题解
2026-08-13 14:08:05
发布于:江苏
0阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200005;
int n,m;
set<int> g[N]; //g[u] 原图中u的邻边集合
set<int> unvis; //未访问节点集合
vector<int> ans;
int bfs(int s){
int cnt = 0; //该联通分量大小
queue<int> q;
q.push(s);
unvis.erase(s);
while(!q.empty()){
int u = q.front(); q.pop();
cnt++;
vector<int> torem;
for(auto v : unvis){ //遍历所有未访问节点
if(g[u].find(v)==g[u].end()){ //原图中不存在 u->v, 则补图中存在 u->v
q.push(v); //访问v,标记为已访问(先存起来,后续统一标记)
torem.push_back(v);
}
}
for(auto v : torem) unvis.erase(v);
}
return cnt;
}
int main(){
cin >> n >> m;
while(m--){
int u,v;
cin >> u >> v;
g[u].insert(v);
g[v].insert(u);
}
for(int i=1;i<=n;i++) unvis.insert(i); //bfs初始化,所有节点未访问
while(!unvis.empty()){ //每个未访问节点出发bfs找联通块
int u = *unvis.begin();
ans.push_back(bfs(u));
}
sort(ans.begin(),ans.end());
cout << ans.size() << "\n";
for(auto v : ans) cout << v << " ";
return 0;
}
这里空空如也




有帮助,赞一个