e-DCC边双缩点:(用之前记得init) cnt1是从2开始的

边双缩点可以将无向图转换为一个森林,如果原图保证连通的话,那么可以转换为一棵树

const int N=1e4+100;const int M=1e5+100;struct Egde
{int to,next;
}edge1[M],edge2[M];int head1[N],head2[N],low[N],dfn[N],c[N],num,cnt1,cnt2,dcc,n,m;bool bridge[M];void addedge1(int u,int v)
{edge1[cnt1].to=v;edge1[cnt1].next=head1[u];head1[u]=cnt1++;
}void addedge2(int u,int v)
{edge2[cnt2].to=v;edge2[cnt2].next=head2[u];head2[u]=cnt2++;
}void tarjan(int u,int in_edge)
{dfn[u]=low[u]=++num;for(int i=head1[u];i!=-1;i=edge1[i].next){int v=edge1[i].to;if(!dfn[v]){tarjan(v,i);low[u]=min(low[u],low[v]);if(low[v]>dfn[u])bridge[i]=bridge[i^1]=true;}else if(i!=(in_edge^1))low[u]=min(low[u],dfn[v]);}
}void dfs(int u)
{c[u]=dcc;for(int i=head1[u];i!=-1;i=edge1[i].next){int v=edge1[i].to;if(c[v]||bridge[i])continue;dfs(v);}
}void solve()
{for(int i=1;i<=n;i++)//找桥 if(!dfn[i])tarjan(i,0);for(int i=1;i<=n;i++)//缩点 if(!c[i]){dcc++;dfs(i);}
}void build()//缩点+连边
{solve();for(int i=2;i<cnt1;i+=2){int u=edge1[i^1].to;int v=edge1[i].to;if(c[u]==c[v])continue;addedge2(c[u],c[v]);addedge2(c[v],c[u]);}
}void init()
{cnt1=2;cnt2=num=dcc=0;memset(head2,-1,sizeof(head2));memset(head1,-1,sizeof(head1));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(bridge,false,sizeof(bridge));memset(c,0,sizeof(c));
}

v-DCC点双缩点:(用之前记得init)

const int N=1e4+100;const int M=1e5+100;struct Egde
{int to,next;
}edge1[M],edge2[M];int head1[N],head2[N],low[N],dfn[N],c[N],Stack[N],new_id[N],num,cnt,cnt1,cnt2,tot,root,top,n,m;bool cut[N];vector<int>dcc[N];void addedge1(int u,int v)
{edge1[cnt1].to=v;edge1[cnt1].next=head1[u];head1[u]=cnt1++;
}void addedge2(int u,int v)
{edge2[cnt2].to=v;edge2[cnt2].next=head2[u];head2[u]=cnt2++;
}void tarjan(int u)
{dfn[u]=low[u]=++num;Stack[++top]=u;if(u==root&&head1[u]==-1){dcc[++cnt].push_back(u);return;}int flag=0;for(int i=head1[u];i!=-1;i=edge1[i].next){int v=edge1[i].to;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]){flag++;if(u!=root||flag>1)cut[u]=true;cnt++;int x;do{x=Stack[top--];dcc[cnt].push_back(x);}while(x!=v);dcc[cnt].push_back(u);}}elselow[u]=min(low[u],dfn[v]);}
}void solve()
{for(int i=1;i<=n;i++)//找割点+缩点 if(!dfn[i]){root=i;tarjan(i);}
}void build()//缩点+连边
{solve();num=cnt;for(int i=1;i<=n;i++)if(cut[i])new_id[i]=++num;for(int i=1;i<=cnt;i++)for(int j=0;j<dcc[i].size();j++){int x=dcc[i][j];if(cut[x]){addedge2(i,new_id[x]);addedge2(new_id[x],i);}elsec[x]=i;}
}void init()
{for(int i=0;i<N;i++)dcc[i].clear();cnt=cnt2=cnt1=num=tot=top=0;memset(head2,-1,sizeof(head2));memset(head1,-1,sizeof(head1));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(cut,false,sizeof(cut));memset(c,0,sizeof(c));memset(Stack,0,sizeof(Stack));memset(new_id,0,sizeof(new_id));
}

无向图缩点:tarjan点双与边双缩点(模板)相关推荐

  1. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  2. Tarjan算法——边双和点双

    边双连通分量 边双连通图:如果一个无向连通图中,没有割边,那么这个无向连通图就是一个边双连通图. 一个无向图的极大边双连通子图就是它的其中一个边双连通分量. 我们要解释下这里"极大" ...

  3. POJ-3352-RoadConstruction(边双联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...

  4. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

  5. 强连通分量及缩点tarjan算法解析

    http://blog.csdn.net/justlovetao/article/details/6673602 有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间 ...

  6. 【原创】tarjan算法初步(强连通子图缩点)

    [原创]tarjan算法初步(强连通子图缩点) tarjan算法的思路不是一般的绕!!(不过既然是求强连通子图这样的回路也就可以稍微原谅了..) 但是研究tarjan之前总得知道强连通分量是什么吧.. ...

  7. 图论复习之强连通分量以及缩点—Tarjan算法

    图论复习之强连通分量以及缩点-Tarjan算法                                 by RtPYH ----------------------------------- ...

  8. 螺毗喃/螺唔嗓/六苯基双咪哇/水杨醛缩苯胺/周蔡靛兰类染料/偶氮/稠环芳香化合物/哗嗓/俘精酸配类/二芳基乙烯化合物

    螺毗喃/螺唔嗓/六苯基双咪哇/水杨醛缩苯胺/周蔡靛兰类染料/偶氮/稠环芳香化合物/哗嗓/俘精酸配类/二芳基乙烯化合物 光致变色指的是某些化合物在一定的波长和强度的光作用下分子结构会发生变化,从而导致其 ...

  9. 双连通分量(点-双连通分量边-双连通分量)

    概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...

  10. 点双连通分量边双联通分量详解

    文章目录 点双连通分量 前言 概念 性质 找割点 找点双 附赠题表 边双连通分量 概念 性质 找割边 找边双 做法1 做法2 题表 一点个人感想 点双连通分量 前言 由于点双和边双都是无向图里面的东西 ...

最新文章

  1. 谈谈对APC的一点理解
  2. 设计时数据源:在PostgreSql 数据查询中使用参数过滤
  3. recurrence relation in parenthesis placing problem
  4. tomcat mysql 启动顺序_linux 上配置tomcat、mysql 开机启动
  5. oracle10g 创建分区表,oracle10G分区的创建与维护Oracle分区表和本地索引
  6. Cisco SSL ×××
  7. 小米11终于来了,12月28日见!
  8. 生鲜配送小程序源码_ThinkPHP社区水果生鲜蔬菜同城配送服务平台 社区团购商城小程序源码...
  9. 业内最小体积SOP8封装,带UART输出,高精度免校准计量芯片HLW8110
  10. 2022考研计算机-软件工程教程
  11. C语言如何作用于unity,在Unity 3D中使用C进行车轮转向#
  12. PC浏览器播放m3u8
  13. 关于一个App调起另一个App
  14. Web应用程序,简单的日志系统解决方案
  15. uboot环境变量setenv学习
  16. PMP第三章:项目经理的角色
  17. 查询各学生的年龄-- 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
  18. 【PAT】A1099. Build A Binary Search Tree (30)
  19. 丁香园php岗_你为什么从丁香园离职?
  20. 剖析Android移动开发程序员的职业发展之路

热门文章

  1. SpringBoot的优势
  2. MySQL高级 - 锁 - MySQL对锁的支持
  3. SpringSecurity分布式整合之common工具模块创建
  4. Nacos-认识和安装Nacos
  5. 函数式接口作为方法的参数【应用】
  6. element-ui介绍
  7. 练习_用if语句替换三元运算符
  8. Request_原理
  9. SpringBoot_配置-properties配置文件编码问题
  10. Oracle 同义词、DBLINK、表空间的使用