题意:有n个点m条边,要求将点尽可能多的分成若干个部分,使得若两个点不在同一个部分则他们之间必定有边

n<=1e5,m<=2e6

思路:From https://blog.csdn.net/clover_hxy/article/details/52980373

转化为求补图联通分量的个数和size,主要是枚举点用链表优化,整体可以做到不带log

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned int uint;
  5. typedef unsigned long long ull;
  6. typedef long double ld;
  7. typedef pair<int,int> PII;
  8. typedef pair<ll,ll> Pll;
  9. typedef vector<int> VI;
  10. typedef vector<PII> VII;
  11. typedef pair<ll,ll>P;
  12. #define N 500010
  13. #define M 1000000
  14. #define INF 1e9
  15. #define fi first
  16. #define se second
  17. #define MP make_pair
  18. #define pb push_back
  19. #define pi acos(-1)
  20. #define mem(a,b) memset(a,b,sizeof(a))
  21. #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
  22. #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
  23. #define lowbit(x) x&(-x)
  24. #define Rand (rand()*(1<<16)+rand())
  25. #define id(x) ((x)<=B?(x):m-n/(x)+1)
  26. #define ls p<<1
  27. #define rs p<<1|1
  28. #define fors(i) for(auto i:e[x]) if(i!=p)
  29.  
  30. const int MOD=1e9+,inv2=(MOD+)/;
  31. double eps=1e-;
  32. int dx[]={-,,,};
  33. int dy[]={,,-,};
  34.  
  35. VI c[N];
  36. int pre[N],nxt[N],vis[N],q[N],a[N],ans,n,m;
  37.  
  38. int read()
  39. {
  40. int v=,f=;
  41. char c=getchar();
  42. while(c<||<c) {if(c=='-') f=-; c=getchar();}
  43. while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
  44. return v*f;
  45. }
  46.  
  47. ll readll()
  48. {
  49. ll v=,f=;
  50. char c=getchar();
  51. while(c<||<c) {if(c=='-') f=-; c=getchar();}
  52. while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
  53. return v*f;
  54. }
  55.  
  56. void del(int u)
  57. {
  58. int t=pre[u];
  59. nxt[t]=nxt[u];
  60. pre[nxt[u]]=t;
  61. }
  62.  
  63. void bfs(int st)
  64. {
  65. int t=,w=;
  66. q[]=st;
  67. while(t<w)
  68. {
  69. a[ans]++;
  70. t++;
  71. int u=q[t];
  72. for(int i=;i<c[u].size();i++)
  73. {
  74. int v=c[u][i];
  75. vis[v]=;
  76. }
  77. for(int i=nxt[];i<=n;i=nxt[i])
  78. if(!vis[i]) del(i),q[++w]=i;
  79. for(int i=;i<c[u].size();i++)
  80. {
  81. int v=c[u][i];
  82. vis[v]=;
  83. }
  84. }
  85. }
  86.  
  87. int main()
  88. {
  89. n=read(),m=read();
  90. rep(i,,n) nxt[i]=i+;
  91. rep(i,,n+) pre[i]=i-;
  92. rep(i,,m)
  93. {
  94. int x=read(),y=read();
  95. c[x].pb(y);
  96. c[y].pb(x);
  97. }
  98. ans=;
  99. for(int i=nxt[];i<=n;i=nxt[])
  100. {
  101. del(i);
  102. ans++;
  103. bfs(i);
  104. }
  105. printf("%d\n",ans);
  106. sort(a+,a+ans+);
  107. rep(i,,ans) printf("%d ",a[i]);
  108. return ;
  109. }

【BZOJ1098】办公楼biu(补图,bfs,链表)的更多相关文章

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

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

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

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

  3. BZOJ1098: [POI2007]办公楼biu

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

  4. 5098: [BZOJ1098][POI2007]办公楼biu

    5098: [BZOJ1098][POI2007]办公楼biu 没有数据结构就很棒 一个看上去非常玄学的代码 const int N=1e5+10,M=2e6+10; int n,m; int fa[ ...

  5. BZOJ1098 POI2007 办公楼biu 【链表+bfs】

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

  6. 【链表】Bzoj1098[POI2007]办公楼biu

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

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

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

  8. 【BZOJ1098】[POI2007]办公楼biu

    题目一开始看以为和强联通分量有关,后来发现是无向边,其实就是求原图的补图的联通块个数和大小.学习了黄学长的代码,利用链表来优化,其实就是枚举每一个人,然后把和他不相连的人都删去放进同一个联通块里,利用 ...

  9. BZOJ 1098: [POI2007]办公楼biu 链表

    求补图连通块,用链表优化,势能O(n+m) #include<cstdio> #include<cstring> #include<iostream> #inclu ...

随机推荐

  1. tez

    参考: 原理: https://www.cnblogs.com/rongfengliang/p/6991020.html https://www.cnblogs.com/hankedang/p/421 ...

  2. numpy使用数组进行数据处理

    numpy使用数组进行数据处理 meshgrid函数 理解: 二维坐标系中,X轴可以取三个值1,2,3, Y轴可以取三个值7,8, 请问可以获得多少个点的坐标? 显而易见是6个: (1,7)(2,7) ...

  3. 关于float的小奥秘

    一. float 存储方式 1.1. float 占四个字节 1.2. 浮点数构成 1.2.1. 无论是单精度还是双精度在存储中都分为三个部分: <1>. 符号位(Sign) : 0代表正 ...

  4. Python sklearn拆分训练集、测试集及预测导出评分 决策树

    机器学习入门 (注:无基础可快速入门,想提高准确率还得多下功夫,文中各名词不做过多解释) Python语言.pandas包.sklearn包   建议在Jupyter环境操作 操作步骤 1.panda ...

  5. for XML path 使用技巧

    FOR XML PATH 是sqlserver数据库的语法,能将查询出的数据转换成xml格式的数据. 首先,我们来看一个正常的查询: SELECT TOP 2 id, name,crDate FROM ...

  6. 5.jQuery之栏切换

    <style> * { margin: 0; padding: 0; } li { list-style-type: none; } .tab { width: 978px; margin ...

  7. 在springboot中集成jsp开发

    springboot就是一个升级版的spring.它可以极大的简化xml配置文件,可以采用全注解形式开发,一个字就是很牛.在springboot想要使用jsp开发,需要集成jsp,在springboo ...

  8. 上载和下载CSV文件

    sap中把txt .excel .文件上载到内表中,txt和csv速度最快. excel文件导出的csv是用,分隔符分隔的,如果单元格的文本中就有逗号,这样会和分隔符逗号混淆,最好abap产生csv文 ...

  9. Scala Option 从官方DOC解析

    Represents optional values. Instances of Option are either an instance of scala.Some or the object N ...

  10. Python3使运行暂停的方法

    在Python3中已经有很大一部分语句与Python2不互通了,运行暂停的方法也有所不同. 1.input(); 这种方法不用包含模块,因此这也是最常用的一种暂停手段. Python2中的raw_in ...