P3452 [POI2007]BIU-Offices
首先能想到 $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的更多相关文章
- P3452 [POI2007]BIU-Offices(链表+bfs)
P3452 [POI2007]BIU-Offices 新姿势:链表存图快速删除 显然两个没有直接相连的点要放到同一个集合里 但是直接搞一个图的补图会挂掉 考虑用链表维护点序列 每次bfs删除一个点和与 ...
- [poi2007] biu
题意:给定一个图,点n<=105,边m<=106,现在求它的补图有多少个联通分量.. 思路:很容易想到并查集,但是补图边太多了.. 于是只能优化掉一些多余的边.. 具体做法是用队列优化.. ...
- [P3452][POI2007]BIU-Offices (BFS)
这里有一个很完美(搞笑但是确实是这样的)翻译 题意 神牛 LXX 昨天刚刚满 18 岁,他现在是个成熟的有为男青年.他有 N 个 MM,分别从 1 到 N 标号. 这些 MM 有些是互相认识的.现在, ...
- 洛谷P3452 [POI2007]BIU-Offices的思考
这题就是坑人的,因为way我前一半存正图,后一半存反图,导致一般扩大两倍过不了,而是要扩大四倍,就是这个坑!!!!! #include<iostream> #include<cstd ...
- 开始做POI啦...
库 为了效率搞了这么一个库: 现在版本号1.14(一月十四日更新版本囧..) http://pan.baidu.com/s/1c0SoGfu [source] http://pan.baidu.com ...
- BZOJ1098: [POI2007]办公楼biu
从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次, ...
- bzoj 1098 [POI2007]办公楼biu bfs+补图+双向链表
[POI2007]办公楼biu Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1543 Solved: 743[Submit][Status][Di ...
- 5098: [BZOJ1098][POI2007]办公楼biu
5098: [BZOJ1098][POI2007]办公楼biu 没有数据结构就很棒 一个看上去非常玄学的代码 const int N=1e5+10,M=2e6+10; int n,m; int fa[ ...
- 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 ...
随机推荐
- 用C语音编写python的扩展模块,也就是python调c库
用C语音编写python的扩展模块,也就是python调c库 1.用C语言扩展Python的功能: http://www.ibm.com/developerworks/cn/linux/l-pyt ...
- 消息中间件之 RabbitMQ
文章内容来源 https://www.cnblogs.com/jun-ma/p/4840869.html 延伸阅读文章 https://blog.csdn.net/growing_duck/artic ...
- 对redis高并发测试的研究
以下引用大神的: 测试项目: https://github.com/14251104246/redis-demo.git 准备 使用docker-compose命令启动redis服务器(可以用其他方式 ...
- HTML和CSS实现的透明登录框效果
实现代码 HTML部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 基于函数计算 + TensorFlow 的 Serverless AI 推理
前言概述 本文介绍了使用函数计算部署深度学习 AI 推理的最佳实践, 其中包括使用 FUN 工具一键部署安装第三方依赖.一键部署.本地调试以及压测评估, 全方位展现函数计算的开发敏捷特性.自动弹性伸缩 ...
- 对拍程序 x
一.介绍 在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全WA.那如何在这种情况下检查自己程序或算法的正确性呢?对拍是一个简便省事的方案. 所谓“对拍 ...
- Leetcode 10. Regular Expression Matching(递归,dp)
10. Regular Expression Matching Hard Given an input string (s) and a pattern (p), implement regular ...
- document.referer
参考文章: 深入理解document.referrer的用法
- Python 字典dict操作定义
字典是用大括号{ }来表示,它是python中最灵活的内置数据类型.它是一个无序的集合,通过键来存取值,而不能用索引. 字典的创建和使用 字典的组成:字典是由大括号{ }来包含其数据的,大括号内包含 ...
- ionic打包app——以安卓版本为例 辛苦之路~~~
最近同事做了个angular项目,因为要离职,所以项目我就来接手了,用ionic打包app,然后无数配置的坑就等着我了~~~ 环境安装 1.nodejs 因为自己刚接触做angular项目,就更新到了 ...