求补图连通块,用链表优化,势能O(n+m)

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define MAXN 100010
  6. using namespace std;
  7. inline int read()
  8. {
  9. int sum=;
  10. char ch=getchar();
  11. while(ch<''||ch>'')ch=getchar();
  12. while(ch>=''&&ch<='')
  13. {
  14. sum=(sum<<)+(sum<<)+ch-;
  15. ch=getchar();
  16. }
  17. return sum;
  18. }
  19. int Next[MAXN],pre[MAXN];
  20. int belong[MAXN];
  21. int mark[MAXN];
  22. struct Tree
  23. {
  24. int to,Next;
  25. }c[MAXN*];
  26. int head[MAXN],t;
  27. int n,m,sz;
  28. inline void add(int x,int y)
  29. {
  30. c[++t].to=y;
  31. c[t].Next=head[x];
  32. head[x]=t;
  33. }
  34. inline void Init()
  35. {
  36. n=read();
  37. m=read();
  38. for(int i=;i<=m;i++)
  39. {
  40. int x=read(),y=read();
  41. add(x,y);
  42. add(y,x);
  43. }
  44. Next[]=;
  45. pre[]=;
  46. for(int i=;i<=n;i++)
  47. {
  48. Next[i]=i+;
  49. pre[i+]=i;
  50. }
  51. }
  52. int q[MAXN],top,tail;
  53. void dfs(int x,int now)
  54. {
  55. belong[x]=now;
  56. for(int i=head[x];i;i=c[i].Next)
  57. mark[c[i].to]=x;
  58. for(int i=Next[];i<=n;i=Next[i])
  59. if(mark[i]!=x)
  60. {
  61. q[++tail]=i;
  62. Next[pre[i]]=Next[i];
  63. pre[Next[i]]=pre[i];
  64. }
  65. }
  66. inline void bfs(int s,int now)
  67. {
  68. top=tail=;
  69. q[]=s;
  70. Next[pre[s]]=Next[s];
  71. pre[Next[s]]=pre[s];
  72. while(top<=tail)
  73. {
  74. int x=q[top++];
  75. dfs(x,now);
  76. }
  77. }
  78. int f[MAXN];
  79. inline void work()
  80. {
  81. for(int x=;x<=n;x++)
  82. if(!belong[x])
  83. {
  84. ++sz;
  85. bfs(x,sz);
  86. }
  87. }
  88. inline void print()
  89. {
  90. for(int i=;i<=n;i++)
  91. f[belong[i]]++;
  92. sort(f+,f+sz+);
  93. printf("%d\n",sz);
  94. for(int i=;i<=sz;i++)
  95. printf("%d ",f[i]);
  96. }
  97. int main()
  98. {
  99. Init();
  100. work();
  101. print();
  102. return ;
  103. }

BZOJ 1098: [POI2007]办公楼biu 链表的更多相关文章

  1. bzoj 1098 [POI2007]办公楼biu——链表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 求补图的连通块大小.与自己没有边的和自己在一个连通块里. 用链表把所有点串起来.先给自 ...

  2. bzoj 1098 [POI2007]办公楼biu bfs+补图+双向链表

    [POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1543  Solved: 743[Submit][Status][Di ...

  3. [BZOJ 1098] [POI2007] 办公楼biu 【链表优化BFS】

    题目链接:BZOJ - 1098 题目分析 只有两个点之间有边的时候它们才能在不同的楼内,那么就是说如果两个点之间没有边它们就一定在同一座楼内. 那么要求的就是求原图的补图的连通块. 然而原图的补图的 ...

  4. 【刷题】BZOJ 1098 [POI2007]办公楼biu

    Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的 电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD ...

  5. bzoj 1098 [POI2007] 办公楼 biu

    # 解题思路 画画图可以发现,只要是两个点之间没有相互连边,那么就必须将这两个人安排到同一个办公楼内,如图所示: 那,我们可以建立补图,就是先建一张完全图,然后把题目中给出的边都删掉,这就是一张补图, ...

  6. bzoj 1098 poi2007 办公楼 bfs+链表

    题意很好理解,求给出图反图的联通块个数. 考虑这样一个事情:一个联通块里的点,最多只会被遍历一次,再遍历时没有任何意义 所以用链表来存,每遍历到一个点就将该点删掉 #include<cstdio ...

  7. BZOJ 1098 [POI2007]办公楼biu(反向图bfs+并查集优化)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1098 [题目大意] 现在有一张图,要求将这张图的点划分为尽量多的分组,对于不同分组的两 ...

  8. 【BZOJ】1098: [POI2007]办公楼biu(补图+bfs+链表)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1098 显然答案是补图连通块..... 想到用并查集...可是连补图的边都已经...n^2了...怎么 ...

  9. BZOJ1098: [POI2007]办公楼biu

    从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次, ...

随机推荐

  1. pyecharts的简单使用

    由于需要在项目中展示数据,查了查资料发现,pyecharts模块在网页数据展示方面有很大优势,所以就学了点pyechas 参考博客:Python:数据可视化pyecharts的使用 - JYRoy - ...

  2. Leecode刷题之旅-C语言/python-69x的平方根

    /* * @lc app=leetcode.cn id=69 lang=c * * [69] x 的平方根 * * https://leetcode-cn.com/problems/sqrtx/des ...

  3. Prime Ring Problem (DFS练习题)

    K - Prime Ring Problem ============================================================================= ...

  4. MySQL 从入门到删库

    基本操作 登陆指令 mysql -u用户名 -p密码(可以非明文输入) -h主机/IP -D端口 --prompt 提示符 修改提示符 \D 日期 \d 当前数据库 \h 服务器名 \u 用户名 // ...

  5. Vue 去脚手架

    上回模仿了一个nw,按照原理说,简单. 今天说Vue,脚手架是个好东西,做项目都给你配置好,不过对于我这种只想做一个界面的人来说,有点儿太大了,用不上. 如果说,不用脚手架要面临哪些问题呢. 1. 组 ...

  6. js字符串操作函数

    js字符串函数 JS自带函数 concat 将两个或多个字符的文本组合起来,返回一个新的字符串. var a = "hello"; var b = ",world&quo ...

  7. ORB-SLAM 代码笔记(二)

    ORB-SLAM中除了第三方库,基本没有看到使用c++11的新特性(例如别的SLAM框架中常用的智能指针,拷贝控制,泛型算法等,基本没有使用动态内存,栈内存读取速度较快),因此非常适合初学,代码很清晰 ...

  8. 圣思源Java视频36节练习源码分享(自己的190+行代码对比老师的39行代码)

    题目: * 随机生成50个数字(整数),每个数字范围是[10,50],统计每个数字出现的次数 * 以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来, * 如果某个数字出现次数为0, ...

  9. .netcore centos环境搭建实战

    步骤 1. 安装VMware Workstation 下载地址:https://my.vmware.com/cn/web/vmware/info/slug/desktop_end_user_compu ...

  10. Android Studio Gradle编译时『No resource found that matches the given name』解决方法(windows系统的坑)

    * 最近帮团队同事配置gradle时,发现一个非常奇怪的问题:> * 同样的gradle配置的项目,只是修改了一个项目的名称,竟然会出现以下奇怪问题: ## 现象1. 一个编译完全OK,另外一个 ...