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…
从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次,就被删除了,但是具体的时间复杂度不好估计.. #include<bits/stdc++.h> #define ll long long using namespace std; inline int read(){ ,f=;char ch=getchar(); ;ch=getchar();} *x…
Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FGD希望职员被安置在尽量多的办公楼当中,这样对于每个职员来说都会有一个相对更好的工作环境.但是,为了联系方便起见,如果两个职员被安置在两个不同的办公楼之内,他们必须拥有彼此的电话号码. Input 第一行包含两个整数N(2<=N<=100000)和M(1<=M&…
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<<)+…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 求补图的连通块大小.与自己没有边的和自己在一个连通块里. 用链表把所有点串起来.先给自己有边的打上标记,删掉自己,然后访问链表里的元素:没有标记的就从链表里删掉并加入栈,对每个栈里的元素重复这个操作直到栈空.一次弄出一个连通块. 这样链表里的元素越删越少,时间复杂度分析一下的话,每个点被删掉一次,其余的访问是因为有边,所以总复杂度O(n+m). #include<iostream>…
[POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1543  Solved: 743[Submit][Status][Discuss] Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FGD希望职员被安置在尽量多的办公楼当中,这样对于每个职员…
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从链表中删去,加到一个临时的链表中存储.…