传送门

首先能想到 $n^2$ 的做法

枚举所有两点,看看是否有边相连,如果没有说明它们一定要在同一集合,用并查集维护一下就行

注意到如果没有边这个条件,其实就相当于问补图有边

所以题意可以转化为,求补图的每个联通块大小

求联通块可以想到 $bfs$,代码大概长这样:

while(!Q.empty())
{
int u=Q.front(); Q.pop(); tim++;
for(int i=fir[u];i;i=from[i]) vis[to[i]]=tim;
for(int i=;i<=n;i++) if(vis[i]!=tim&&!inq[i]) Q.push(i);//inq[]维护点是否在队列中
}

但是这样枚举点还是 $O(n^2)$ 的,发现对于已经在队列中的点,完全没有必要枚举到

所以维护一个链表,只存当前未访问过的点,每个点一访问到就删了,这样每个点只访问一次,每条边只访问两次

复杂度是线性的,然后就可过了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+,M=4e6+;
int n,m,pre[N],nex[N],ans[N],tot,vis[N],tim;
int fir[N],from[M],to[M],cntt;
inline void add(int a,int b) { from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; }
inline void del(int x) { pre[nex[x]]=pre[x]; nex[pre[x]]=nex[x]; }
queue <int> Q;
int main()
{
n=read(),m=read(); int a,b;
for(int i=;i<=m;i++)
{
a=read(),b=read();
add(a,b); add(b,a);
}
for(int i=;i<=n;i++) pre[nex[i]=i+]=i;
while(nex[]!=n+)
{
int x=nex[],cnt=;
Q.push(x); del(x);
while(!Q.empty())
{
int u=Q.front(); Q.pop(); cnt++; tim++;
for(int i=fir[u];i;i=from[i]) vis[to[i]]=tim;
for(int i=nex[];i!=n+;i=nex[i]) if(vis[i]!=tim) Q.push(i),del(i);
}
ans[++tot]=cnt;
}
sort(ans+,ans+tot+);
printf("%d\n",tot);
for(int i=;i<=tot;i++) printf("%d ",ans[i]);
printf("\n");
return ;
}

P3452 [POI2007]BIU-Offices的更多相关文章

  1. P3452 [POI2007]BIU-Offices(链表+bfs)

    P3452 [POI2007]BIU-Offices 新姿势:链表存图快速删除 显然两个没有直接相连的点要放到同一个集合里 但是直接搞一个图的补图会挂掉 考虑用链表维护点序列 每次bfs删除一个点和与 ...

  2. [poi2007] biu

    题意:给定一个图,点n<=105,边m<=106,现在求它的补图有多少个联通分量.. 思路:很容易想到并查集,但是补图边太多了.. 于是只能优化掉一些多余的边.. 具体做法是用队列优化.. ...

  3. [P3452][POI2007]BIU-Offices (BFS)

    这里有一个很完美(搞笑但是确实是这样的)翻译 题意 神牛 LXX 昨天刚刚满 18 岁,他现在是个成熟的有为男青年.他有 N 个 MM,分别从 1 到 N 标号. 这些 MM 有些是互相认识的.现在, ...

  4. 洛谷P3452 [POI2007]BIU-Offices的思考

    这题就是坑人的,因为way我前一半存正图,后一半存反图,导致一般扩大两倍过不了,而是要扩大四倍,就是这个坑!!!!! #include<iostream> #include<cstd ...

  5. 开始做POI啦...

    库 为了效率搞了这么一个库: 现在版本号1.14(一月十四日更新版本囧..) http://pan.baidu.com/s/1c0SoGfu [source] http://pan.baidu.com ...

  6. BZOJ1098: [POI2007]办公楼biu

    从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次, ...

  7. bzoj 1098 [POI2007]办公楼biu bfs+补图+双向链表

    [POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1543  Solved: 743[Submit][Status][Di ...

  8. 5098: [BZOJ1098][POI2007]办公楼biu

    5098: [BZOJ1098][POI2007]办公楼biu 没有数据结构就很棒 一个看上去非常玄学的代码 const int N=1e5+10,M=2e6+10; int n,m; int fa[ ...

  9. Connected Components? Codeforces - 920E || 洛谷 P3452 &&bzoj1098 [POI2007]BIU-Offices

    https://codeforces.com/contest/920/problem/E https://www.luogu.org/problemnew/show/P3452 https://www ...

随机推荐

  1. Ubuntu 压缩文件命令

    tar -czvf name-of-archive.tar.gz /path/to/directory-or-file -c: Create an archive. -z: Compress the ...

  2. day03记 angular代码

    一.AngularJs AngularJS 是一个 JavaScript 框架.通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML. 1.四大特征 MVC模式.模块化.自动化双向数据绑 ...

  3. mongdb 数据库

    安装mongdb 下载地址 https://www.runoob.com/mongodb/mongodb-window-install.html 检查 mongdb 是否安装成功which mongd ...

  4. Codeforces 916B Jamie and Binary Sequence ( 模拟 && 思维 )

    题意 : 给出一个数 n ,要求你用 k 个二的幂来组成这个数,要求输出这 k 个二的幂的指数,如果有多解情况则优先输出最大指数最小的那一个且要求按字典序输出,不存在则输出 No 分析 :  先来说一 ...

  5. 「JOISC 2016 Day 3」回转寿司

    https://loj.ac/problem/2736 题解 挺有意思的题. 考虑这种操作不好直接维护,还有时限比较长,所以考虑分块. 考虑一个操作对整个块的影响,无非就是可能把最大的拿走,再把新的元 ...

  6. Spring Cloud教程(十)自定义引导配置属性源

    可以通过在org.springframework.cloud.bootstrap.BootstrapConfiguration键下添加条目/META-INF/spring.factories来训练引导 ...

  7. oracle 如何更改密码的hash

    如何迁移oracle user的密码到新的环境,一下列出了方法: select name,spare4||';'||password pwd from sys.user$ where name = ' ...

  8. Hyperledger交易流程

    Hyperledger Fabric Network中的角色 在Hyperledger中,由三种类型的角色: Client:应用客户端,用于将终端用户的交易请求发送到区块链网络: Peers:负责维护 ...

  9. jenkins打包ios 报错rror: No signing certificate "iOS Distribution" found: No "iOS Distribution...

    错误提示如图: error: No signing certificate "iOS Distribution" found: No "iOS Distribution& ...

  10. 003-CHROME开发者工具的小技巧

    首先调试先进入到调试模式,快键键F12 1.代码格式化 有很多css/js的代码都会被 minify 掉,你可以点击代码窗口左下角的那个 { }  标签,chrome会帮你给格式化掉. 2.强制DOM ...