P3452 [POI2007]BIU-Offices(链表+bfs)
新姿势:链表存图快速删除
显然两个没有直接相连的点要放到同一个集合里
但是直接搞一个图的补图会挂掉
考虑用链表维护点序列
每次bfs删除一个点和与其没有直接相连的点
复杂度大概。。。能过
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int read(){
char c=getchar(); int x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return x;
}
#define N 100005
#define M 4000005
int n,m,pr[N],nx[N],ans,pos[N]; bool is[N];
int Cnt,hd[N],nxt[M],ed[N],poi[M];
void adde(int x,int y){
nxt[ed[x]]=++Cnt; hd[x]=hd[x]?hd[x]:Cnt;
ed[x]=Cnt; poi[Cnt]=y;
}
void del(int x){nx[pr[x]]=nx[x]; pr[nx[x]]=pr[x];}
#define to poi[i]
void bfs(int S){
queue <int> h; h.push(S);
while(!h.empty()){
int x=h.front(); h.pop(); ++pos[ans];
for(int i=hd[x];i;i=nxt[i]) is[to]=;
for(int i=nx[];i<=n;i=nx[i])
if(!is[i]) del(i),h.push(i);
for(int i=hd[x];i;i=nxt[i]) is[to]=;
}
}
int main(){
n=read(); m=read();
for(int i=;i<=n+;++i) pr[i]=i-,nx[i]=i+;
for(int i=,u,v;i<=m;++i)
u=read(),v=read(),adde(u,v),adde(v,u);
for(int i=nx[];i<=n;i=nx[]) ++ans,del(i),bfs(i);
sort(pos+,pos+ans+);
printf("%d\n",ans);
for(int i=;i<=ans;++i) printf("%d ",pos[i]);
return ;
}
P3452 [POI2007]BIU-Offices(链表+bfs)的更多相关文章
- BZOJ1098 POI2007 办公楼biu 【链表+bfs】
Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决 ...
- BZOJ_1098_[POI2007]办公楼biu_链表优化BFS
BZOJ_1098_[POI2007]办公楼biu_链表优化BFS Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的 电话号 ...
- 【BZOJ】1098: [POI2007]办公楼biu(补图+bfs+链表)
http://www.lydsy.com/JudgeOnline/problem.php?id=1098 显然答案是补图连通块..... 想到用并查集...可是连补图的边都已经...n^2了...怎么 ...
- [BZOJ 1098] [POI2007] 办公楼biu 【链表优化BFS】
题目链接:BZOJ - 1098 题目分析 只有两个点之间有边的时候它们才能在不同的楼内,那么就是说如果两个点之间没有边它们就一定在同一座楼内. 那么要求的就是求原图的补图的连通块. 然而原图的补图的 ...
- [P3452][POI2007]BIU-Offices (BFS)
这里有一个很完美(搞笑但是确实是这样的)翻译 题意 神牛 LXX 昨天刚刚满 18 岁,他现在是个成熟的有为男青年.他有 N 个 MM,分别从 1 到 N 标号. 这些 MM 有些是互相认识的.现在, ...
- BZOJ 1098 [POI2007]办公楼biu(反向图bfs+并查集优化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1098 [题目大意] 现在有一张图,要求将这张图的点划分为尽量多的分组,对于不同分组的两 ...
- P3452 [POI2007]BIU-Offices
传送门 首先能想到 $n^2$ 的做法 枚举所有两点,看看是否有边相连,如果没有说明它们一定要在同一集合,用并查集维护一下就行 注意到如果没有边这个条件,其实就相当于问补图有边 所以题意可以转化为,求 ...
- [poi2007] biu
题意:给定一个图,点n<=105,边m<=106,现在求它的补图有多少个联通分量.. 思路:很容易想到并查集,但是补图边太多了.. 于是只能优化掉一些多余的边.. 具体做法是用队列优化.. ...
- 洛谷P3452 [POI2007]BIU-Offices的思考
这题就是坑人的,因为way我前一半存正图,后一半存反图,导致一般扩大两倍过不了,而是要扩大四倍,就是这个坑!!!!! #include<iostream> #include<cstd ...
随机推荐
- Linux性能优化从入门到实战:09 内存篇:Buffer和Cache
Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储. 避免跟文中的"缓存"一词混淆,而文中的"缓存",则通指内存中的临时存储 ...
- leetcode69. x 的平方根 🌟
题目: 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 ...
- ShellExecute指定IE浏览器打开
ShellExecute(NULL,L"open", L"iexplore.exe", L"www.baidu.com", NULL, SW ...
- 函数柯里化(Currying)小实践
什么是函数柯里化 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 Ch ...
- Spring---异步消息
1.异步消息 1.1.目的: 为了 系统与系统 之间的通信: 1.2.概念: 异步消息 :消息的 发送者 无需 等待消息 接收者的处理及返回,甚至 无需 关心消息是否发送成功: 1. ...
- window10 安装 docker
0.打开Hyper-V. 安装成功后,查看“任务管理器”: 1.下载安装程序. 2.一路"next"安装.安装成功后,桌面会出现图标: 3.双击该图标,成功运行后,右小角出现: 右 ...
- ASP 转换HTML特殊字符
Function HtmlDecode(ByVal s) If Has(s) Then s = regReplace(s, "<br\s*/?\s*>", vbCrLf ...
- phpjm解密程序,也适用于其他混淆加密的破解
<?php $file = 'plugin.php'; //要破解的文件 $fp = fopen($file, 'r'); $str = fread($fp, filesize($file)); ...
- Java实践-远程调用Shell脚本并获取输出信息
1.添加依赖 <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-s ...
- 新建 SecondPresenter 实现类
package com.test.mvp.mvpdemo.mvp.v6.presenter; import com.test.mvp.mvpdemo.mvp.v6.SecondContract;imp ...