tarjan系列算法代码小结
个人使用,可能不是很详细
强联通分量
这里的dfn可以写成low
因为都是在栈中,只要保证该节点的low值不为本身即可
void tarjan(int now)
{
dfn[now]=low[now]=++tot;
s.push(now);
vis[now]=1;
for(int i=headE[now];i!=-1;i=E[i].nxt)
{
if(!dfn[E[i].v])
tarjan(E[i].v),low[now]=min(low[now],low[E[i].v]);
else if(vis[E[i].v])
low[now]=min(low[now],dfn[E[i].v]);
}
if(low[now]==dfn[now])
{
int h;
colornum++;
do
{
h=s.top();
color[h]=colornum;
sum[colornum]+=money[h];
vis[h]=0;
s.pop();
}while(h!=now);
}
}
点双联通分量
条件\(low[j]>=dfn[i]\)
栈的边界条件需要特殊判断
void tarjan(int now,int fa)
{
dfn[now]=low[now]=++tot;
s.push(now);
for(int i=head[now];i!=-1;i=edge[i].nxt)
{
if(!dfn[edge[i].v]&&edge[i].v!=fa)
{
tarjan(edge[i].v,now);
low[now]=min(low[now],low[edge[i].v]);
if(low[edge[i].v]>=dfn[now])
{
memset(in,0,sizeof(in));//哪些在双联通分量里
memset(color,0,sizeof(color));
int h=0,cnt=0;
do
{
h=s.top();s.pop();
in[h]=1;
point[++cnt]=h;
}while(h!=edge[i].v);//warning
if(cnt<=1) continue;//必须构成环
in[now]=1;point[++cnt]=now;
if(MakeColor(now,1)==0)
for(int j=1;j<=cnt;j++)
ans[point[j]]=1;
}
}
if(edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]);
}
}
边双联通分量
记录一下父亲节点就好
void tarjan(int now,int fa)
{
dfn[now]=low[now]=++tot;
s.push(now);
vis[now]=1;
for(int i=head[now];i!=-1;i=edge[i].nxt)
{
if(!dfn[edge[i].v]&&edge[i].v!=fa)
tarjan(edge[i].v,now),low[now]=min(low[now],low[edge[i].v]);
if(vis[edge[i].v]&&edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]);
}
if(dfn[now]==low[now])
{
int h=0;
colornum++;
do
{
h=s.top();
color[h]=colornum;
s.pop();
}while(h!=now);
}
}
割顶
条件\(low[j]>=dfn[i]\)
int tarjan(int now,int fa)
{
int ch=0;
dfn[now]=low[now]=++tot;
for(int i=head[now];i!=-1;i=edge[i].nxt)
{
if(!dfn[edge[i].v])
{
tarjan(edge[i].v,fa);
low[now]=min(low[now],low[edge[i].v]);
if(low[edge[i].v]>=dfn[now]&&now!=fa) cut[now]=1;
if(now==fa) ch++;
}
low[now]=min(low[now],dfn[edge[i].v]);
}
if(now==fa&&ch>=2) cut[now]=1;
}
割边
条件\(low[v]>dfn[now]\)
void tarjan(int now,int fa)
{
dfn[now]=low[now]=++tot;
for(int i=head[now];i!=-1;i=edge[i].nxt)
{
if(!dfn[edge[i].v])
{
deep[edge[i].v]=deep[now]+1;
f[edge[i].v]=now;
tarjan(edge[i].v,now);
low[now]=min(low[now],low[edge[i].v]);
if(low[edge[i].v]>dfn[now])
{
bridge[edge[i].v]=1;
ans++;
}
}
else if(edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]);
}
}
tarjan系列算法代码小结的更多相关文章
- Tarjan系列算法总结(hdu 1827,4612,4587,4005)
tarjan一直是我看了头大的问题,省选之前还是得好好系统的学习一下.我按照不同的算法在hdu上选题练习了一下,至少还是有了初步的认识.tarjan嘛,就是维护一个dfsnum[]和一个low[],在 ...
- 集成学习值Adaboost算法原理和代码小结(转载)
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...
- Tarjan系列1
tajan的dfs树系列算法: 求解割点,桥,强连通分量,点双联通分量,边双联通分量: tajan是一个dfs,把一个图变成一个dfs树结构, dfs树结构,本质是通过一个没有任何要求的dfs把图的边 ...
- 集成学习之Adaboost算法原理小结
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boostin ...
- LCA问题的ST,tarjan离线算法解法
一 ST算法与LCA 介绍 第一次算法笔记这样的东西,以前学算法只是笔上画画写写,理解了下,刷几道题,其实都没深入理解,以后遇到新的算法要把自己的理解想法写下来,方便日后回顾嘛>=< R ...
- LCA最近公共祖先(Tarjan离线算法)
这篇博客对Tarjan算法的原理和过程模拟的很详细. 转载大佬的博客https://www.cnblogs.com/JVxie/p/4854719.html 第二次更新,之前转载的博客虽然胜在详细,但 ...
- HDU-2586-How far away(LCA Tarjan离线算法)
链接:https://vjudge.net/problem/HDU-2586 题意: 勇气小镇是一个有着n个房屋的小镇,为什么把它叫做勇气小镇呢,这个故事就要从勇气小镇成立的那天说起了,修建小镇的时候 ...
- 基于BP神经网络的简单字符识别算法自小结(C语言版)
本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前面的闲话: 自我感觉自己应该不是一个非常 ...
- tarjan图论算法
tarjan图论算法 标签: tarjan 图论 模板 洛谷P3387 [模板]缩点 算法:Tarjan有向图强连通分量+缩点+DAGdp 代码: #include <cstdio> #i ...
随机推荐
- aspnet core2中使用csp内容安全策略
aspnet core2中使用csp内容安全策略 问题:aspnet core2如何使用csp防止xss的攻击 方法: public void ConfigureServices( IServiceC ...
- [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)
[.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...
- React-Native的基本控件属性方法,对React-Native的学习,从熟悉基本控件开始。
对React-Native的学习,从熟悉基本控件开始. View 属性方法 序号 名称 属性Or方法 类型 说明 1 accessibilityLabel 属性 string 2 accessib ...
- 使用MUI的日期控件引起的探索——HTML5 input类型date属性
我写移动端的页面会用到MUI这个框架,个人觉得挺好用的,有很多实用的UI组件.当然坑还是有的,http://dev.dcloud.net.cn/mui/ui/ MUI官网,有兴趣的小伙伴可以看看 虽然 ...
- [Swift]LeetCode434. 字符串中的单词数 | Number of Segments in a String
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
- [Swift]LeetCode659. 分割数组为连续子序列 | Split Array into Consecutive Subsequences
You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...
- [Swift]LeetCode784. 字母大小写全排列 | Letter Case Permutation
Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...
- 第2章 Java编程基础
本章重点 ·Java的基本语法形式 ·Java语言中的常量与变量 ·Java语言运算符的使用 ·Java程序的流程控制 ·Java中方法的定义与使用 ·Java中数组的定义与使用 2.1 Java的基 ...
- Java破解图片防盗链
前言 今天想下载几张好看的壁纸,然后发现了一张是自己比较喜欢的额.然后点进去看看,WOW!好多好看的壁纸呀,于是我就起了贪念.哈哈!想把他们这一组图片打包下载,小白的方法就是一张一张下载,那样对于我们 ...
- spark按某几列删除dataframe重复行
新建一个 dataframe : val conf = new SparkConf().setAppName("TTyb").setMaster("local" ...