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. 【UVA】11991 Easy Problem from Rujia Liu? (整数v第k次出现在什么位置)
  2. hdoj1087 (DP--LIS)
  3. 腾讯云副总裁答治茜:移动互联网破局要借助“三张网”
  4. Async下处理多个异常
  5. as3转换为html5,AS3和HTML5 - 使用正则表达式将字符串解析为数组
  6. [大学回忆录]我的本命年
  7. php 百度报表工具下载,PHP Report Maker12最新版
  8. AI版“大家来找茬”上线,究竟谁是真人,谁是GAN生成的假脸?
  9. 机器人参数校准的原理
  10. ProcExp的利用
  11. hourstracker 考勤表软件下载
  12. 【推荐系统】特征值分解(谱分解)和奇异值分解(SVD),即在PCA上的应用
  13. mysql standby_数据库的 standby模式
  14. 如果生活将我们拆散了
  15. 夏令营一部分数学试题
  16. 三星修复软件+连接三星认证服务器,三星云服务从2月6日起不再支持第三方应用程序数据备份...
  17. 前端CSS代码格式化、JavaScript代码格式化函数
  18. MATLAB中的偏最小二乘回归(PLSR)和主成分回归(PCR)
  19. 十三、买空卖空、融资融券、配资与杠杆
  20. VIM_readme

热门文章

  1. Spring Set注入简化写法1
  2. 分布式架构下常见序列化技术-了解序列化的发展
  3. MyBatis 翻页的几种方式和区别?
  4. 基于Xml 的IOC 容器-分配路径处理策略
  5. Redis的诞生历程
  6. 使用匿名内部类创建线程
  7. 为什么要用RabbitMQ
  8. Spring Session实战3
  9. jconsole工具检测堆内存变化
  10. javascript高级程序设计pdf_2019年最好的JavaScript图表库