tarjan全家桶
2024-08-31 19:48:57
tarjan 全家桶
- 关于tarjan 它太强了 CCCOrz
dfs树&low
dfs树:在图上做不重复经过同一点的dfs,经过的边与点形成一棵树。于是图上所有点都被这棵树包含,一部分边被包含。称被包含的点叫树边,其他边叫回边。整个图就是dfs树,由于是由dfs得到。所以dfs树有非常强的性质,所有回边一定是从一点开始,到它的一个祖先,也就是说两棵没有交集的子树之间一定没有边相连。
dfn:dfn[now]表示now点的dfn序。
low:在做tarjan算法时通常需要开一个low数组,low的定义在处理不同问题时可能略有区别。大体为low[rt]表示以rt为根的子树中经过树边和一条回边能到达的dfn最小的点的dfn。
其实理解tarjan的最好办法就是感性
强连通分量
void tarjan(int now)
{
dfn[now]=low[now]=++tot;
s.push(now);in[now]=1;
for(int i=head[now];i;i=nxt[i])
{
if(!dfn[to[i]])
tarjan(to[i]),low[now]=min(low[to[i]],low[now]);
else if(in[to[i]])
low[now]=min(dfn[to[i]],low[now]);
}
if(low[now]==dfn[now])
{
color++;
while(in[now])
{
in[s.top()]=0;
col[s.top()]=color;
ac[color]+=a[s.top()];
s.pop();
}
}
}
割点
void tarjan(int now,int fa)
{
low[now]=dfn[now]=++cnt;
int son=0;
for(int i=head[now];i;i=nxt[i])
{
int v=to[i];
if(!dfn[v])
{
tarjan(v,now);
low[now]=min(low[now],low[v]);
if(low[v]>=dfn[now]&&fa!=now)
is[now]=1;
son++;
}
else low[now]=min(low[now],dfn[v]);
}
if(fa==now&&son>=2)
is[now]=1;
}
双连通分量(圆方树)
void tarjan(int now)///建立圆方树
{
dfn[now]=low[now]=++dfc;
stk[++tp]=now;
++tot;
for(int i=0;i<e[now].size();i++)
{
int to=e[now][i];
//cout<<"qwq"<<' '<<now<<' '<<to<<endl;
if(!dfn[to])
{
//cout<<"in"<<' '<<to<<endl;
tarjan(to);
//cout<<"out"<<' '<<now<<' '<<to<<' '<<low[to]<<endl;
low[now]=min(low[now],low[to]);
if(low[to]==dfn[now])///now就是桥
{
cnt++;///方点+1
for(int x=0;x!=to;--tp)///由于桥可能同时在多个双连通分量内,所以now不出栈
{
x=stk[tp];
v[cnt]++;
t[cnt].push_back(x);
t[x].push_back(cnt);///连接方点和圆点
}
t[now].push_back(cnt);
t[cnt].push_back(now);
v[cnt]++;
}
}
else ///由于是双向边,此时to[i]必然是i的父节点,根据low的定义无需考虑to[i]。
low[now]=min(low[now],dfn[to]);
}
}
最新文章
- 使用Spring发送带附件的电子邮件(站内和站外传送)
- 【Windows编程】系列第八篇:通用对话框
- PHP缓存技术
- 如何在WPF的DiagramControl中绘制一个类型数据关系图的方法
- typedef使用大全(转)
- jQuery:获取浏览器中的分辨率
- RMAN 备份
- Swift - 文本输入框内容改变时响应,并获取最新内容
- javascript screen对象
- mybatis一级缓存
- php事务回滚
- java实现PC之间的udp数据单向传输
- hdu 1198 (并查集 or dfs) Farm Irrigation
- python垃圾回收
- 【读书笔记】iOS-网络-使用推送通知
- oracle 查询 约束
- find命令/文件名后缀
- opencv-python教程学习系列1-安装库
- SYS.AUD$无法扩容导致无法登录的问题
- Office WORD如何设置表格背景颜色
热门文章
- C++ NFS挂载
- 交通运输类文档下载——JT/T 808-2019、JT/T 809-2019文档分享
- ubuntu无法找到ifconfig(command not found: ifconfig)
- 【机器学*】k-*邻算法(kNN) 学*笔记
- Cornfields(poj2019)
- python学习第五天:python基础(string、list、tuple)
- Redis常见使用场景
- PlatformIO+Jlink进行调试
- <;数据结构>;图的最小生成树
- MySQL高级查询与编程笔记 • 【目录】