[POI2007]BIU-Offices

题意

给定\(n(\le 100000)\)个点\(m(\le 2000000)\)条边的无向图\(G\),求这个图\(G\)补图的连通块个数。


一开始想了半天各种啥啥啥优化补图连边。

但复杂度没算好,最开始\(\tt{set}\)的想法是可以通过此题的。

使用链表+队列可以做到\(O(n+m)\)的复杂度

具体流程如下:

  1. 将所有的点加入链表
  2. 从链表中随便拿出一个点加入队列,如果链表为空,结束
  3. 遍历队列
    • 对于当前点,把\(\tt{Ta}\)的连接的边打标记。
    • 遍历链表,取出没有打标记的点从链表中删去并加入队列。
    • 取消标记。
  4. 在\(3\)中进入队列的点统计为一个连通块

考虑这样的复杂度为什么是\(O(n+m)\)的

每条边两边的点会被打一次标记并取消一次标记,并最多一次作为遍历链表时没有被删去的点,这里是\(O(m)\)的。

每个点最多会从链表中删去一次,这里是\(O(n)\)的。


Code:

  1. #include <cstdio>
  2. #include <algorithm>
  3. const int N=1e5+10;
  4. const int M=2e6+10;
  5. int head[N],to[M<<1],Next[M<<1],cnt;
  6. void add(int u,int v)
  7. {
  8. to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
  9. }
  10. int n,m,pre[N],suc[N],q[N],l,r,ans[N],col[N],tot;
  11. int main()
  12. {
  13. scanf("%d%d",&n,&m);
  14. for(int u,v,i=1;i<=m;i++)
  15. scanf("%d%d",&u,&v),add(u,v),add(v,u);
  16. for(int i=1;i<=n;i++)
  17. pre[i]=i-1,suc[i]=i+1;
  18. suc[0]=1,suc[n]=0;
  19. while(suc[0])
  20. {
  21. l=1,r=0;
  22. q[++r]=suc[0];
  23. suc[0]=suc[suc[0]];
  24. pre[suc[q[r]]]=0;
  25. while(l<=r)
  26. {
  27. int now=q[l++];
  28. for(int i=head[now];i;i=Next[i])
  29. col[to[i]]=1;
  30. int cur=suc[0];
  31. while(cur)
  32. {
  33. if(!col[cur])
  34. {
  35. q[++r]=cur;
  36. pre[suc[cur]]=pre[cur];
  37. suc[pre[cur]]=suc[cur];
  38. }
  39. cur=suc[cur];
  40. }
  41. for(int i=head[now];i;i=Next[i])
  42. col[to[i]]=0;
  43. }
  44. ans[++tot]=l-1;
  45. }
  46. std::sort(ans+1,ans+1+tot);
  47. printf("%d\n",tot);
  48. for(int i=1;i<=tot;i++) printf("%d ",ans[i]);
  49. return 0;
  50. }

2018.11.8

洛谷 [POI2007]BIU-Offices 解题报告的更多相关文章

  1. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  2. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  3. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  4. 洛谷 P3527 [POI2011]MET-Meteors 解题报告

    P3527 [POI2011]MET-Meteors 题意翻译 \(\tt{Byteotian \ Interstellar \ Union}\)有\(N\)个成员国.现在它发现了一颗新的星球,这颗星 ...

  5. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  6. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  7. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  8. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  9. 洛谷 [HNOI2014]道路堵塞 解题报告

    [HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...

  10. 洛谷 P1452 Beauty Contest 解题报告

    P1452 Beauty Contest 题意 求平面\(n(\le 50000)\)个点的最远点对 收获了一堆计算几何的卡点.. 凸包如果不保留共线的点,在加入上凸壳时搞一个相对栈顶,以免把\(n\ ...

随机推荐

  1. Excel小技巧整理(持续更新)

    合并某列中相同单元格 参考https://jingyan.baidu.com/article/9158e00006db70a25512286f.html 使用方法 先给需要合并的列排序,这样相同数据会 ...

  2. Nginx快速入门

    本文主要介绍nginx的基本配置和操作,并介绍了一些可以完成的简单任务. 假设您已经学习过并已经安装好了nginx服务器. 如果没有,请参阅安装nginx页面(http://www.yiibai.co ...

  3. python-__getattr__ 和 __getattribute__

    python3完全使用了新式类,废弃了旧式类,getattribute作为新式类的一个特性有非常奇妙的作用.查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上 ...

  4. 【Python 开发】Python目录

    目录: [Python开发]第一篇:计算机基础 [Python 开发]第二篇 :Python安装 [Python 开发]第三篇:python 实用小工具

  5. UVa 10071

    简单运动学公式 v=v0+at x=v0t+1/2*a*t^2=2vt #include<stdio.h> int main() { int v, t; while((scanf(&quo ...

  6. Codeforces 552 E. Two Teams

    E. Two Teams time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. Docker入门与实践之 docker安装与了解

    一.Docker 概述 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  8. YQCB冲刺周第一天

    团队讨论的照片 任务看板为 今天小组成员讨论了每个页面的排版,每个页面的跳转,以及页面的排版. 今天准备编写登录界面的.注册界面的代码. 遇到的困难是用户记账时选择的分类标准很多,最后将其整合,删减.

  9. 按Right-BICEP要求的对任务二的测试用例

    测试方法:Right-BICEP 测试计划 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.P-是否满足性能要求? 4.是否有乘除法? 5.是否有括号? 6.是否有真分数? ...

  10. 404 Note Found -(课堂实战)- 项目UML设计(团队)

    目录 团队信息 分工选择 课上分工 课下分工 ToDolist alpha版本要做的事情 燃尽图 UML 用例图 状态图 活动图 类图 部署图 实例图 对象图 时序图 包图 通信图 贡献分评定 课上贡 ...