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 ...
随机推荐
- 详解Spring MVC 集成EHCache缓存_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 废话少说,直接上代码: ehcache.xml 文件 <?xml version="1.0" ...
- 【bzoj 4554】【Tjoi2016&Heoi2016】【NOIP2016模拟7.12】游戏
题目 分析 当没有石头的时候,就用二分图匹配来做. 但现在加入了石头, 所以,求出每行和每列联通快的个数,如果有一块平地,包括在某个行联通块以及某个列联通块中,连边. //无聊打了网络流,匈牙利也可以 ...
- 使用IDEA自动生成Java实体类
在上一篇帖子里,我们已经通过idea连接上了数据库,这里,通过IDEA自带的功能来根据数据库字段生成POJO 1. 选中一张表,右键--->Scripted Extensions--->选 ...
- C#项目类型分三种,Dos(控制台),c/s(客户端与服务器),b/s(浏览器/服务器)
- 《SQL Server 2012 T-SQL基础》读书笔记 - 2.单表查询
Chapter 2 Single-Table Queries GROUP BY之后的阶段的操作对象就是组(可以把一组想象成很多行组成的)了,HAVING负责过滤掉一些组.分组后的COUNT(*)表示每 ...
- React Native商城项目实战08 - 设置“More”界面cell
1.自定义可复用的cell More/CommonCell.js: /** * 自定义可复用的cell */ import React, { Component } from 'react'; imp ...
- Laravel5.5执行 npm run dev时报错,提示cross-env找不到(not found)的解决办法
Laravel 5.4 Mix & Laravel5.5执行 npm run dev时报错,提示cross-env找不到(not found)的解决办法 首先进入package.json文 ...
- CSS - 初始值、指定值、计算值、应用值、实际值
初始值:未提供指定值且未从父元素指定值继承的 CSS 属性的值. 指定值:通过直接声明或 CSS 属性的值. 计算值:通过需要计算得到的值,如,继承和相对的尺寸.(注意:有些计算要等到布局确定才能进行 ...
- 监听整个页面上的DOM树变化
在线预览 方法 使用<Web API 接口>的<MutationObserver> MutationObserver 网上查到的很多都是使用Mutation events的,但 ...
- python-笔记(六)模块操作以及常用模块简介
模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思是说把python代码写到里面,文件名就是模块的名称,例如:model.py model就是模块名称. 什么是包? ...