上一次我们讲到了边双,这次我们来看点双。

说实话来说,点双比边双稍微复杂一些;

学完边双,我们先看一道题

第一问都不用说了吧,多余的道路,明显的割边。

是不是首先想到用边双,但是我们来看一个图:

有点丑,但是凑活看吧。

它是一个边双,但是!!!!它竟然没有冲突的边!!!

此时我们就要用点双了(是不是想打死我,竟然没讲,先坑人)

先看概念

都说概念是非常重要的,但是概念似乎有点笼统,可以附图解说

点双的一大特点是它可以重复用点,而那个点就是割点,而我们的缩点操作也是用割点连接各个点双的。

那么我们来看算法,我们在Tarjan时,用栈去维护点双,之后用vector去储存。

我们直接来看上面的题,就会明白这不是点双吗?

然后寻找规律,我们会发现,每一个点双中,只要边个数大于点个数,那么这里的边都是冲突的,那么我们的Code就跃然纸上了

  1. #include<bits/stdc++.h>
  2. #define maxn 10007
  3. #define M 100007
  4. using namespace std;
  5. int n,m,cent=,t,head[maxn],low[maxn],dfn[maxn],ans1,ans2;
  6. int stackk[maxn],cnt,top,root,cut[maxn],col[maxn],vis[maxn];
  7. int ol;
  8. vector<int >dcc[maxn];
  9. struct node{
  10. int next,to;
  11. }edge[M*];
  12.  
  13. inline void add(int u,int v){
  14. edge[++cent]=(node){head[u],v};head[u]=cent;
  15. }
  16.  
  17. void Tarjan(int x,int fa){
  18. dfn[x]=low[x]=++t;
  19. stackk[++top]=x;//入栈
  20. if(x==root&&head[x]==){//不联通时的孤立点
  21. dcc[++cnt].push_back(x);
  22. return ;
  23. }
  24. for(int i=head[x];i;i=edge[i].next){
  25. int y=edge[i].to;
  26. if(!dfn[y]){
  27. Tarjan(y,i);
  28. low[x]=min(low[x],low[y]);//与其他的一样
  29. if(low[y]>=dfn[x]){
  30. if(low[y]>dfn[x]) ans1++;//记录割边个数
  31. int z;cnt++;
  32. do{
  33. z=stackk[top--];//从栈中取出
  34. dcc[cnt].push_back(z);//存入
  35. }while(z!=y);//停止条件,这个可以想一想为什么
  36. dcc[cnt].push_back(x);//把割点也存进去
  37. }
  38. }else if((i^)!=fa) low[x]=min(low[x],dfn[y]);
  39. }
  40. }
  41.  
  42. void clear(){
  43. ans1=ans2=top=cnt=t=ol=;cent=;
  44. memset(head,,sizeof head);
  45. memset(low,,sizeof low);
  46. memset(dfn,,sizeof dfn);
  47. memset(stackk,,sizeof stackk);
  48. memset(dcc,,sizeof dcc);
  49. memset(col,,sizeof col);
  50. memset(edge,,sizeof edge);
  51. }
  52.  
  53. int main(){
  54. // freopen("way.in","r",stdin);
  55. // freopen("way.out","w",stdout);
  56. while(scanf("%d%d",&n,&m)){
  57. if(n==&&m==)break;
  58. clear();
  59. int a,b;
  60. for(int i=;i<=m;i++){
  61. scanf("%d%d",&a,&b);
  62. add(a+,b+),add(b+,a+);//由于点从零开始,那么我们+1即可
  63. }
  64. for(int i=;i<=n;i++){
  65. if(!dfn[i]) root=i,Tarjan(i,-);
  66. }
  67. for(int i=;i<=cnt;i++,ol=){
  68. for(int j=;j<dcc[i].size();j++){
  69. vis[dcc[i][j]]=;//记录点双上的点
  70. }
  71. for(int k=;k<dcc[i].size();k++){
  72. for(int j=head[dcc[i][k]];j;j=edge[j].next){
  73. if(vis[edge[j].to]) ol++;//ol统计边数
  74. }
  75. }
  76. if(ol/>dcc[i].size()) ans2+=ol/;//由于是双向边,ol会统计量词
  77. memset(vis,,sizeof(vis));
  78. }
  79. printf("%d %d\n",ans1,ans2);
  80. }
  81. }

那么我们就应该懂了一些基本的概念,和简单的操作,那么,留一个彩蛋,我们该如何去缩点连接呢?

图论分支-Tarjan初步-点双连通分量的更多相关文章

  1. 图论分支-Tarjan初步-边双联通分量

    本来应该先说强连通分量,但是有一定的分配,所以这个在下一篇博客将会见到. 这个本想连点连通分量一起讲,但是量有点大,所以我就分两步讲. 我们先看定义 再来看看图解 很容易就能发现,只要将割边断掉,然后 ...

  2. 图论分支-Tarjan初步-割点和割边

    所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...

  3. hdu 2460(tarjan求边双连通分量+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2460 思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边 ...

  4. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  5. C++[Tarjan求点双连通分量,割点][HNOI2012]矿场搭建

    最近在学图论相关的内容,阅读这篇博客的前提是你已经基本了解了Tarjan求点双. 由割点的定义(删去这个点就可使这个图不连通)我们可以知道,坍塌的挖煤点只有在割点上才会使这个图不连通,而除了割点的其他 ...

  6. Tarjan求点双连通分量

    概述 在一个无向图中,若任意两点间至少存在两条“点不重复”的路径,则说这个图是点双连通的(简称双连通,biconnected) 在一个无向图中,点双连通的极大子图称为点双连通分量(简称双连通分量,Bi ...

  7. tarjan复习笔记 双连通分量,强连通分量

    声明:图自行参考割点和桥QVQ 双连通分量 如果一个无向连通图\(G=(V,E)\)中不存在割点(相对于这个图),则称它为点双连通图 如果一个无向连通图\(G=(V,E)\)中不存在割边(相对于这个图 ...

  8. Codeforces Beta Round #89 (Div. 2) E. Bertown roads(Tarjan、边双连通分量)

    题目链接:http://codeforces.com/problemset/problem/118/E 思路:首先要判断图是否是边双连通,这个Tarjan算法可以判断,若low[v] > dfn ...

  9. 6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)

    题目描述 Description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在 ...

随机推荐

  1. 在一般类中通过XmlWebApplicationContext对象获取应用部署上下文Context

    XmlWebApplicationContext xwac = (XmlWebApplicationContext) ContextLoader.getCurrentWebApplicationCon ...

  2. python之旅七【第七篇】面向对象之类成员

    面向对象的类成员 相关知识点 一  字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Provinc ...

  3. Python代码编写规范

    Python代码编写规范 编码: a)     如无特殊情况,文件一律使用UTF-8编码 b)     如无需特殊情况,文件头部必须加入#-*-coding:utf-8-*- 缩进 a)     统一 ...

  4. 【刷题】BZOJ 2759 一个动态树好题

    Description 有N个未知数x[1..n]和N个等式组成的同余方程组: x[i]=k[i]*x[p[i]]+b[i] mod 10007 其中,k[i],b[i],x[i]∈[0,10007) ...

  5. 自学华为IoT物联网_09 OceanConnect业务流程

    点击返回自学华为IoT物流网 自学华为IoT物联网_09 OceanConnect业务流程 1.  物流网重要的连个协议介绍 1.1  重要物联网协议介绍----MQTT MQTT(消息队列遥测传输) ...

  6. luogu5022 [NOIp2018]旅行 (dfs)

    m=n-1的时候,就直接贪心地dfs就可以 m=n的话,就可以枚举删掉一条边,然后照着m=n-1做 $O(n^2)$大概能过 (然而我眼瞎看不到m<=n) #include<cstdio& ...

  7. 【git】git撤销与回滚

    git的撤销与回滚在平时使用中还是比较多的,比如说我们想将某个修改后的文件撤销到上一个版本,或者是想撤销某次多余的提交,都要用到git的撤销和回滚操作.撤销分两种情况,一个是commit之前,一个是c ...

  8. ArcGIS for qml -添加自由文本

    源码:https://github.com/sueRimn/ArcGIS-for-qml-demos 实现地图上鼠标点击后添加自由文本功能 作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载 ...

  9. [FWT] UOJ #310. 【UNR #2】黎明前的巧克力

    [uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) F ...

  10. 斯坦福大学公开课机器学习:advice for applying machine learning | diagnosing bias vs. variance(机器学习:诊断偏差和方差问题)

    当我们运行一个学习算法时,如果这个算法的表现不理想,那么有两种原因导致:要么偏差比较大.要么方差比较大.换句话说,要么是欠拟合.要么是过拟合.那么这两种情况,哪个和偏差有关.哪个和方差有关,或者是不是 ...