BZOJ 1098: [POI2007]办公楼biu 链表
求补图连通块,用链表优化,势能O(n+m)
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define MAXN 100010
- using namespace std;
- inline int read()
- {
- int sum=;
- char ch=getchar();
- while(ch<''||ch>'')ch=getchar();
- while(ch>=''&&ch<='')
- {
- sum=(sum<<)+(sum<<)+ch-;
- ch=getchar();
- }
- return sum;
- }
- int Next[MAXN],pre[MAXN];
- int belong[MAXN];
- int mark[MAXN];
- struct Tree
- {
- int to,Next;
- }c[MAXN*];
- int head[MAXN],t;
- int n,m,sz;
- inline void add(int x,int y)
- {
- c[++t].to=y;
- c[t].Next=head[x];
- head[x]=t;
- }
- inline void Init()
- {
- n=read();
- m=read();
- for(int i=;i<=m;i++)
- {
- int x=read(),y=read();
- add(x,y);
- add(y,x);
- }
- Next[]=;
- pre[]=;
- for(int i=;i<=n;i++)
- {
- Next[i]=i+;
- pre[i+]=i;
- }
- }
- int q[MAXN],top,tail;
- void dfs(int x,int now)
- {
- belong[x]=now;
- for(int i=head[x];i;i=c[i].Next)
- mark[c[i].to]=x;
- for(int i=Next[];i<=n;i=Next[i])
- if(mark[i]!=x)
- {
- q[++tail]=i;
- Next[pre[i]]=Next[i];
- pre[Next[i]]=pre[i];
- }
- }
- inline void bfs(int s,int now)
- {
- top=tail=;
- q[]=s;
- Next[pre[s]]=Next[s];
- pre[Next[s]]=pre[s];
- while(top<=tail)
- {
- int x=q[top++];
- dfs(x,now);
- }
- }
- int f[MAXN];
- inline void work()
- {
- for(int x=;x<=n;x++)
- if(!belong[x])
- {
- ++sz;
- bfs(x,sz);
- }
- }
- inline void print()
- {
- for(int i=;i<=n;i++)
- f[belong[i]]++;
- sort(f+,f+sz+);
- printf("%d\n",sz);
- for(int i=;i<=sz;i++)
- printf("%d ",f[i]);
- }
- int main()
- {
- Init();
- work();
- print();
- return ;
- }
BZOJ 1098: [POI2007]办公楼biu 链表的更多相关文章
- bzoj 1098 [POI2007]办公楼biu——链表
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 求补图的连通块大小.与自己没有边的和自己在一个连通块里. 用链表把所有点串起来.先给自 ...
- bzoj 1098 [POI2007]办公楼biu bfs+补图+双向链表
[POI2007]办公楼biu Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1543 Solved: 743[Submit][Status][Di ...
- [BZOJ 1098] [POI2007] 办公楼biu 【链表优化BFS】
题目链接:BZOJ - 1098 题目分析 只有两个点之间有边的时候它们才能在不同的楼内,那么就是说如果两个点之间没有边它们就一定在同一座楼内. 那么要求的就是求原图的补图的连通块. 然而原图的补图的 ...
- 【刷题】BZOJ 1098 [POI2007]办公楼biu
Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的 电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD ...
- bzoj 1098 [POI2007] 办公楼 biu
# 解题思路 画画图可以发现,只要是两个点之间没有相互连边,那么就必须将这两个人安排到同一个办公楼内,如图所示: 那,我们可以建立补图,就是先建一张完全图,然后把题目中给出的边都删掉,这就是一张补图, ...
- bzoj 1098 poi2007 办公楼 bfs+链表
题意很好理解,求给出图反图的联通块个数. 考虑这样一个事情:一个联通块里的点,最多只会被遍历一次,再遍历时没有任何意义 所以用链表来存,每遍历到一个点就将该点删掉 #include<cstdio ...
- BZOJ 1098 [POI2007]办公楼biu(反向图bfs+并查集优化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1098 [题目大意] 现在有一张图,要求将这张图的点划分为尽量多的分组,对于不同分组的两 ...
- 【BZOJ】1098: [POI2007]办公楼biu(补图+bfs+链表)
http://www.lydsy.com/JudgeOnline/problem.php?id=1098 显然答案是补图连通块..... 想到用并查集...可是连补图的边都已经...n^2了...怎么 ...
- BZOJ1098: [POI2007]办公楼biu
从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次, ...
随机推荐
- pyecharts的简单使用
由于需要在项目中展示数据,查了查资料发现,pyecharts模块在网页数据展示方面有很大优势,所以就学了点pyechas 参考博客:Python:数据可视化pyecharts的使用 - JYRoy - ...
- Leecode刷题之旅-C语言/python-69x的平方根
/* * @lc app=leetcode.cn id=69 lang=c * * [69] x 的平方根 * * https://leetcode-cn.com/problems/sqrtx/des ...
- Prime Ring Problem (DFS练习题)
K - Prime Ring Problem ============================================================================= ...
- MySQL 从入门到删库
基本操作 登陆指令 mysql -u用户名 -p密码(可以非明文输入) -h主机/IP -D端口 --prompt 提示符 修改提示符 \D 日期 \d 当前数据库 \h 服务器名 \u 用户名 // ...
- Vue 去脚手架
上回模仿了一个nw,按照原理说,简单. 今天说Vue,脚手架是个好东西,做项目都给你配置好,不过对于我这种只想做一个界面的人来说,有点儿太大了,用不上. 如果说,不用脚手架要面临哪些问题呢. 1. 组 ...
- js字符串操作函数
js字符串函数 JS自带函数 concat 将两个或多个字符的文本组合起来,返回一个新的字符串. var a = "hello"; var b = ",world&quo ...
- ORB-SLAM 代码笔记(二)
ORB-SLAM中除了第三方库,基本没有看到使用c++11的新特性(例如别的SLAM框架中常用的智能指针,拷贝控制,泛型算法等,基本没有使用动态内存,栈内存读取速度较快),因此非常适合初学,代码很清晰 ...
- 圣思源Java视频36节练习源码分享(自己的190+行代码对比老师的39行代码)
题目: * 随机生成50个数字(整数),每个数字范围是[10,50],统计每个数字出现的次数 * 以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来, * 如果某个数字出现次数为0, ...
- .netcore centos环境搭建实战
步骤 1. 安装VMware Workstation 下载地址:https://my.vmware.com/cn/web/vmware/info/slug/desktop_end_user_compu ...
- Android Studio Gradle编译时『No resource found that matches the given name』解决方法(windows系统的坑)
* 最近帮团队同事配置gradle时,发现一个非常奇怪的问题:> * 同样的gradle配置的项目,只是修改了一个项目的名称,竟然会出现以下奇怪问题: ## 现象1. 一个编译完全OK,另外一个 ...