P3452 [POI2007]BIU-Offices(链表+bfs)】的更多相关文章

Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FGD希望职员被安置在尽量多的办公楼当中,这样对于每个职员来说都会有一个相对更好的工作环境.但是,为了联系方便起见,如果两个职员被安置在两个不同的办公楼之内,他们必须拥有彼此的电话号码. Input 第一行包含两个整数N(2<=N<=100000)和M(1<=M&…
P3452 [POI2007]BIU-Offices 新姿势:链表存图快速删除 显然两个没有直接相连的点要放到同一个集合里 但是直接搞一个图的补图会挂掉 考虑用链表维护点序列 每次bfs删除一个点和与其没有直接相连的点 复杂度大概...能过 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespac…
BZOJ_1098_[POI2007]办公楼biu_链表优化BFS Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的 电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FG D希望职员被安置在尽量多的办公楼当中,这样对于每个职员来说都会有一个相对更好的工作环境.但是,为了联 系方便起见,如果两个职员被安置在两个不同的办公楼之内,他们必须拥有彼此的电话号码. Input…
http://www.lydsy.com/JudgeOnline/problem.php?id=1098 显然答案是补图连通块..... 想到用并查集...可是连补图的边都已经...n^2了...怎么做.. 好神的题! 考虑我们是如何建补图和并查集:是不是都是先枚举一个点,然后标记能到达的点,然后没到达的点就是要连的边.最后在来一次并查集. 是吧.. 那么考虑:为什么要并查集...我们找到没到达的点就行了么...那么肯定就是在一个连通块,问题在于如何将整个连通块找出来.bfs! 考虑:我们之前放…
题目链接:BZOJ - 1098 题目分析 只有两个点之间有边的时候它们才能在不同的楼内,那么就是说如果两个点之间没有边它们就一定在同一座楼内. 那么要求的就是求原图的补图的连通块. 然而原图的补图的边数是 n^2 级别的,非常庞大,我们不能直接把补图求出来. 可以使用一种用链表优化BFS的做法,开始时将所有的点加到一个链表里. 每次找一个连通块的时候BFS,在链表中取出一个点,在链表中删除,加入队列,然后每次取出队首元素x,枚举x的每一条边,将边的终点y从链表中删去,加到一个临时的链表中存储.…
这里有一个很完美(搞笑但是确实是这样的)翻译 题意 神牛 LXX 昨天刚刚满 18 岁,他现在是个成熟的有为男青年.他有 N 个 MM,分别从 1 到 N 标号. 这些 MM 有些是互相认识的.现在,LXX 为了处理和 MM 们复杂的关系,想把他们划分成尽量多的集合, 要求任意两个属于不同集合的 MM 都必须互相认识.这样方便交流.现在 LXX 想知道最多可以分成多 少个集合,每个集合的人数是多少. 输入输出样例 输入样例 输出样例 这题可以BFS过 比较好的一道题 但是因为我太菜了打不来,还是…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1098 [题目大意] 现在有一张图,要求将这张图的点划分为尽量多的分组,对于不同分组的两个点 要求必须存在连边. [题解] 不同分组之间的两点必须连边等价于没有连边的点一定在同一分组内, 所以题目转化为求反图的连通块和其大小,搜索的理论复杂度O(n^2),显然不行, bfs的时候对于已经归入其余连通块的点用并查集进行段无效信息处理,减少搜索树的分支, 显然经过这样的处理搜索分支的数量下…
传送门 首先能想到 $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; ;i<=n;i++) if(vi…
题意:给定一个图,点n<=105,边m<=106,现在求它的补图有多少个联通分量.. 思路:很容易想到并查集,但是补图边太多了.. 于是只能优化掉一些多余的边.. 具体做法是用队列优化.. 刚开始把所有没被连接的点用一个链表连接起来,那么选取一个未扩展得点u,就可以吧链表分成两个,一个就是跟他补图有边的,一个是没边的.. 并把有边的跟他连接起来..删除链表..并放入队列.. 这样每个点进入队列一次,每条边被访问2次..时间复杂度为O(n+m) code: #include<cstdio&…
这题就是坑人的,因为way我前一半存正图,后一半存反图,导致一般扩大两倍过不了,而是要扩大四倍,就是这个坑!!!!! #include<iostream> #include<cstdio> #include<queue> #include<algorithm> using namespace std; ; struct node { int val; int next; }way[maxn]; queue< int >q; int n,m; ],…
序:为什么写poi,zy说poi都是思路题目,不像hnoi妈的数据结构队..... 1.bzoj1102 题目大意:定义了一个山谷和山峰,求他们数量. 题解:这种题bfs咯,在bfs的时候记录一下相邻的比我大的有多少,比我小的有多少,然后更新答案: 代码: #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #defin…
库 为了效率搞了这么一个库: 现在版本号1.14(一月十四日更新版本囧..) http://pan.baidu.com/s/1c0SoGfu [source] http://pan.baidu.com/s/1c0UqCXq [precompiled] 版权之类就随他去吧..WTFPL.. 用法:释放在include文件目录里就可以使用#include <poi.h>啦..!(当然对于lemon.cena之类也适用) 或者如果不要求评测..可以用#include "poi.h"…
1 前言 1.1 进程调度 内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来. 调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 1.2 进程的分类 linux把进程区分为实时进程和非实时进程, 其中非实时进程进一步划分为交互式进程和批处理进程 类型 描述 示例 交互式进程(interactive process) 此类进程经常与用户进行交互, 因此需要花费很多时…
转发:http://blog.csdn.net/gatieme/article/details/51701149  1 前言 1.1 进程调度 内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来. 调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 1.2 进程的分类 linux把进程区分为实时进程和非实时进程, 其中非实时进程进一步划分为交互式进程和批处理进程 类型…
[POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1543  Solved: 743[Submit][Status][Discuss] Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FGD希望职员被安置在尽量多的办公楼当中,这样对于每个职员…
题意很好理解,求给出图反图的联通块个数. 考虑这样一个事情:一个联通块里的点,最多只会被遍历一次,再遍历时没有任何意义 所以用链表来存,每遍历到一个点就将该点删掉 #include<cstdio> #include<cstring> #include<iostream> #include<vector> #include<algorithm> using namespace std; #define N 100005 int e=1,head[N…
Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼. FGD希望职员被安置在尽量多的办公楼当中,这样对于每个职员来说都会有一个相对更好的工作环境.但是,为了联系方便起见,如果两个职员被安置在两个不同的办公楼之内,他们必须拥有彼此的电话号码. Input 第一行包含两个整数N(2<=N<=100000)和M(1<=M…
求补图连通块,用链表优化,势能O(n+m) #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 100010 using namespace std; inline int read() { ; char ch=getchar(); ')ch=getchar(); ') { sum=(sum<<)+(sum<<)+…
题意:有n个点m条边,要求将点尽可能多的分成若干个部分,使得若两个点不在同一个部分则他们之间必定有边 n<=1e5,m<=2e6 思路:From https://blog.csdn.net/clover_hxy/article/details/52980373 转化为求补图联通分量的个数和size,主要是枚举点用链表优化,整体可以做到不带log #include<bits/stdc++.h> using namespace std; typedef long long ll; ty…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 求补图的连通块大小.与自己没有边的和自己在一个连通块里. 用链表把所有点串起来.先给自己有边的打上标记,删掉自己,然后访问链表里的元素:没有标记的就从链表里删掉并加入栈,对每个栈里的元素重复这个操作直到栈空.一次弄出一个连通块. 这样链表里的元素越删越少,时间复杂度分析一下的话,每个点被删掉一次,其余的访问是因为有边,所以总复杂度O(n+m). #include<iostream>…
从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次,就被删除了,但是具体的时间复杂度不好估计.. #include<bits/stdc++.h> #define ll long long using namespace std; inline int read(){ ,f=;char ch=getchar(); ;ch=getchar();} *x…
https://codeforces.com/contest/920/problem/E https://www.luogu.org/problemnew/show/P3452 https://www.lydsy.com/JudgeOnline/problem.php?id=1098 CF貌似出了原题? 这几个都是一样的,输入输出都一样,就是读入一张图,要求补图的连通块个数以及各个连通块大小 可以这样搞:维护一个set表示所有当前没到过的点:一开始所有点加进去 取出set中任意点作为起始点并从s…
5098: [BZOJ1098][POI2007]办公楼biu 没有数据结构就很棒 一个看上去非常玄学的代码 const int N=1e5+10,M=2e6+10; int n,m; int fa[N]; int Find(int x){ return fa[x]==x?x:fa[x]=Find(fa[x]); } vector <int> G[N]; typedef vector <int> ::iterator iter; void merge(int x,int y){ x…
https://oj.neu.edu.cn/problem/1387 给一个点数N <= 100000, 边 <= 1000000的无向图,求补图的联通块数,以及每个块包含的点数 由于点数太大,补图会是稠密图,甚至建立补图都要O(n^2),只能挖掘一下联通块,bfs,补图的性质,从原图入手求补图的联通块: 在原图中不直接相邻的点,在补图中一定属于同一个联通块 每个点只属于一个联通块,所以找好一个联通块之后可以删去这个联通块的所有点,把图规模缩小 这样子:1.准备一个集合放所有未探索的点,初始化…
http://codeforces.com/problemset/problem/920/E 题意:求一个图的补图的连通分量个数以及每个连通分量里的点个数 如果这不是一个补图,BFS或者并查集可过,但是补图显然是一个稠密图,O(n2)的算法会T,但我们依然可以用BFS来直接跑,但是需要用到链表来进行优化,对于一般的情况而言,开一个vis记录的数组,每次进行O(n)的遍历即可,但是在这一题中,由于在BFS内需要多次遍历可用数组,我们选择用链表来记录所有可用的点,当他们被分配到一个联通块里的时候,入…
Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的 电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FG D希望职员被安置在尽量多的办公楼当中,这样对于每个职员来说都会有一个相对更好的工作环境.但是,为了联 系方便起见,如果两个职员被安置在两个不同的办公楼之内,他们必须拥有彼此的电话号码. Input 第一行包含两个整数N(2<=N<=100000)和M(1<…
P3456 [POI2007]GRZ-Ridges and Valleys 八个方向都跑一遍bfs,顺便判断一下是山峰还是山谷,或者是山坡(俩都不是) (实在不知道要说啥了qwq) #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #include<queue> using namespace std; inline int Int(){ ; while(…
题目一开始看以为和强联通分量有关,后来发现是无向边,其实就是求原图的补图的联通块个数和大小.学习了黄学长的代码,利用链表来优化,其实就是枚举每一个人,然后把和他不相连的人都删去放进同一个联通块里,利用bfs来实现.——by VANE #include<bits/stdc++.h> using namespace std; ; ; struct edge{int to,next;}e[M]; int a[N],q[N]; int pre[N],next[N],last[N]; int bel[N…
# 解题思路 画画图可以发现,只要是两个点之间没有相互连边,那么就必须将这两个人安排到同一个办公楼内,如图所示: 那,我们可以建立补图,就是先建一张完全图,然后把题目中给出的边都删掉,这就是一张补图,显然补图中相互连边的点就放在同一栋办公楼内. 我们可以用并查集来完成,但是数据范围显然不允许用这样的方法,建图的复杂度是 $N^2$ 的.所以考虑另一种方法: 将原图建立好,在原图中,从一个点开始,把这个点所能够直接到达的点标记出来,这些点是不可以放在一起的.然后将这些点删除. 之后对每一个点都进行…
Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FGD希望职员被安置在尽量多的办公楼当中,这样对于每个职员来说都会有一个相对更好的工作环境.但是,为了联系方便起见,如果两个职员被安置在两个不同的办公楼之内,他们必须拥有彼此的电话号码. Input 第一行包含两个整数N(2<=N<=100000)和M(1<=M&…