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.lydsy.com/JudgeOnline/problem.php?id=1098
CF貌似出了原题?
这几个都是一样的,输入输出都一样,就是读入一张图,要求补图的连通块个数以及各个连通块大小
可以这样搞:维护一个set表示所有当前没到过的点;一开始所有点加进去
取出set中任意点作为起始点并从set中删除,以此为起点进行bfs,直到set为空;则同一次bfs中经过的点是同一个连通块内的
从某个点u开始bfs的时候,就先找出所有原图中与u有边的点v,如果set中还有v就从set中暂时删掉v(记录下哪一些是实际删掉的)
然后当前set中所有点都是u能到达的,暴力加入bfs的队列并从set中删除;处理完这个u后,再向set中加回前面暂时删掉的点
set可以换成链表。。就O(n+m)了
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<list>
#include<queue>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
struct E
{
int to,nxt;
}e[];
int f1[],ne;
list<int> li;
list<int>::iterator it[];
queue<int> q;
int n,m;
int tt[];
int an[];
int main()
{
int i,a,b,t,u,sz,k;
list<int>::iterator i1;
scanf("%d%d",&n,&m);
for(i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
e[++ne].to=b;e[ne].nxt=f1[a];f1[a]=ne;
e[++ne].to=a;e[ne].nxt=f1[b];f1[b]=ne;
}
for(i=;i<=n;i++) it[i]=li.insert(li.end(),i);
while(!li.empty())
{
t=li.front();li.erase(it[t]);it[t]=li.end();
sz=;
q.push(t);
while(!q.empty())
{
u=q.front();q.pop();
sz++;
tt[]=;
for(k=f1[u];k;k=e[k].nxt)
if(it[e[k].to]!=li.end())
{
tt[++tt[]]=e[k].to;
li.erase(it[e[k].to]);
it[e[k].to]=li.end();
}
while(!li.empty())
{
t=li.front();li.erase(it[t]);it[t]=li.end();
q.push(t);
}
for(i=;i<=tt[];i++) it[tt[i]]=li.insert(li.end(),tt[i]);
}
an[++an[]]=sz;
}
sort(an+,an+an[]+);
printf("%d\n",an[]);
for(i=;i<=an[];i++) printf("%d ",an[i]);
return ;
}
好像也可以改成bfs到点u时,就枚举当前set中剩余的所有点v,然后判断(u,v)是否存在于原图中,如果答案为否则将v加入队列,如果用哈希表判断边是否存在则复杂度仍然O(n+m)
Connected Components? Codeforces - 920E || 洛谷 P3452 &&bzoj1098 [POI2007]BIU-Offices的更多相关文章
- Connected Components? CodeForces - 920E (bfs)
大意:给定无向图, 求补图的连通块数 bfs模拟即可, 这里用了map存图, set维护未划分的点集, 复杂度$O(nlog^2n)$, 用链表的话可以$O(n)$ #include <iost ...
- 线段树 C - Connected Components? CodeForces - 920E
这个题目居然可以用线段树写,好震惊,如果不是在线段树专题肯定想不到,但是就算在线段树的专题里面,我也不太会怎么写. 这个题目大意是,给你n m n代表n个点,m代表m条边,然后就是m行,每行两个数字, ...
- Shortest Path Codeforces - 59E || 洛谷P1811 最短路_NOI导刊2011提高(01)
https://codeforces.com/contest/59/problem/E 原来以为不会..看了题解发现貌似自己其实是会的? 就是拆点最短路..拆成n^2个点,每个点用(i,j)表示,表示 ...
- 洛谷P3452 [POI2007]BIU-Offices的思考
这题就是坑人的,因为way我前一半存正图,后一半存反图,导致一般扩大两倍过不了,而是要扩大四倍,就是这个坑!!!!! #include<iostream> #include<cstd ...
- 洛谷P3455 ZAP-Queries [POI2007] 莫比乌斯反演+数论分块
正解:莫比乌斯反演 解题报告: 传送门! 首先这题刚看到就很,莫比乌斯反演嘛,和我前面写了题解的那个一模一样的,所以这儿就不讲这前边的做法辣QAQ 但是这样儿还有个问题,就现在已知我每次都是要O(n) ...
- BZOJ1101 & 洛谷3455:[POI2007]ZAP——题解
https://www.luogu.org/problemnew/show/3455#sub http://www.lydsy.com/JudgeOnline/problem.php?id=1101 ...
- 题解【洛谷P3456】[POI2007]GRZ-Ridges and Valleys
题面 考虑 \(\text{Flood Fill}\). 每次在 \(\text{BFS}\) 扩展的过程中增加几个判断条件,记录山峰和山谷的个数即可. #include <bits/stdc+ ...
- [洛谷3457][POI2007]POW-The Flood
洛谷题目链接:[POI2007]POW-The Flood 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方 ...
- [洛谷P3460] [POI2007]TET-Tetris Attack
洛谷题目链接:[POI2007]TET-Tetris Attack 题目描述 A puzzle called "Tetris Attack" has lately become a ...
随机推荐
- HDU4850 Wow! Such String! —— 字符串构造
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4850 代码如下: #include <iostream> #include <cst ...
- the art of seo(chapter three)
SEO Planning: Customizing Your Strategy ***Developing an SEO Plan Prior to Site Development***Determ ...
- php排序方法之冒泡排序
//冒泡排序法 $arr = array(3,55,45,2,67,76,6.7,-65,85,4); function bubblingSort($arr){ for ( $i=0; $i<c ...
- tkinter.py
from tkinter import * def hello():print('hello world') win=Tk() win.title('hello tkinter') win.geome ...
- BZOJ_3729_Gty的游戏_博弈论+splay+dfs序
BZOJ_3729_Gty的游戏_博弈论+splay+dfs序 Description 某一天gty在与他的妹子玩游戏. 妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子 ...
- Python框架下django 的并发和多线程
django 的并发能力真的是令人担忧,django本身框架下只有一个线程在处理请求,任何一个请求阻塞,就会影响另一个情感求的响应,尤其是涉及到IO操作时,基于框架下开发的视图的响应并没有对应的开启多 ...
- Markdown Reader 插件改造
Markdown Reader 是一款比较好用的浏览markdown文件的chrome插件 插件地址:https://chrome.google.com/webstore/detail/markdow ...
- TX1 Gsteramer 环境配置
安装命令: sudo add-apt-repository universe sudo add-apt-repository multiverse sudo apt-get update -tools ...
- bzoj4455
容斥原理+dp 首先考虑暴力做法,我们希望点和点一对一,那么自然要保存当前点集的状态,需要状压,据说要3^n,那么自然不行 考虑容斥原理,刚才一一对应的限制太强了,我们不要一一对应,只要满足边存在就行 ...
- Ubuntu系统多屏显示
Ubuntu系统多屏显示参见: 第一个为笔记本屏幕,第二个为外接屏幕 http://www.linuxidc.com/Linux/2014-06/103677.htm http://www.linux ...