Connected Components? Codeforces - 920E || 洛谷 P3452 &&bzoj1098 [POI2007]BIU-Offices
2024-08-30 11:07:39
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)
最新文章
- 3.C#面向对象基础聊天机器人
- 云存储的那些事(2)——数据分布算法CRUSH
- bringSubviewToFront和insertSubview: atIndex:
- JAVA的名词释义
- SQL 修改数据库架构名
- TCP/IP协议知识科普
- Active控件有关问题
- 将 Java Spring Framework 应用程序迁移到 Windows Azure
- JSON理解
- 数据库 用SQL语句操作数据
- 路飞学城-Python开发集训-第2章
- bus实现兄弟组件传值
- python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战
- Python之旅Day2 元组 字符串 字典 集合
- JavaWeb开发中采用FreeMarker生成Excel表格
- 想要进步,就要阅读大神的博客,再推荐一波springmvc映射路径之url的action请求
- python工具 - alert弹框输出姓名年龄、求和
- ns3的输入输出奥秘(一) LOGGING系统
- 【Spring】SpringMVC中浅析数据的传递方式
- EBS管理员为供应商创建新联系人流程
热门文章
- JavaScript学习第四天
- POJ 1611 The Suspects (并查集+数组记录子孙个数 )
- HDU2586 How far away? —— 倍增LCA
- 关于Zookeeper
- BestCoder3 1001 Task schedule(hdu 4907) 解题报告
- SSL handshake_decode_error
- 【C】貌似不友好的scanf()
- bzoj1013高斯消元
- MTK touchscreen 流程
- 【旧文章搬运】为什么win32k.sys在System进程空间无法访问