Tarjan,我相信大多数人是这么写的:

void tarjan(int x)
{
dfn[x]=low[x]=++cnt;
st.push(x),vis[x]=1;
for(int i=head[x];i;i=nxt[i])
{
int u=to[i];
if(!dfn[u])
{
tarjan(u);
low[x]=min(low[x],low[u]);
}else if(vis[u])
low[x]=min(low[x],dfn[u]);
}
//......
}

那么,在else句中,为什么是low[x]=min(low[x],dfn[u])而非low[x]=min(low[x],low[u])呢?

我们来观察这样一个图:

(画图工具画的有点难看)

很明显,③是割点。如果从1开始Tarjan,我们发现,如果用dfn更新,那么1、2、3在同一个强连通分量,即low=1。而4、5的low则是3.这样是正确的。

但如果用low更新的话,4、5的low全部都将更新为1.因为当5查询到3时,若用low更新5的low,5的low就被更新为3的low——1.这显然是错误的。

最新文章

  1. jquery easyui 1.4.1 API( CHM版)
  2. .net之工作流工程展示及代码分享(一)工作流表单
  3. C#中的选择语句
  4. python entrypoint
  5. php socket
  6. JS魔法堂:追忆那些原始的选择器
  7. Data Plane Development Kit (DPDK): Getting Started
  8. Linux下如何进行FTP设置
  9. codebook法分割前景目标
  10. 各种oracle10g下载地址(官网网页上好像找不到了)
  11. 安卓模拟器tools修改
  12. apache-DOS
  13. 【English】20190418
  14. Android 控件背景选择图片还是drawable XML资源
  15. vs2017 winform打包
  16. fatal error C1010: 在查找预编译头时遇到意外的文件结尾
  17. 【CF949D】Curfew(贪心)
  18. Linux下的串口编程实例
  19. session 详解
  20. 【DevExpress v17.2新功能预告】改进DevExtreme编辑器

热门文章

  1. 单点突破:Set
  2. 使用regulator_get时的一个小注意事项
  3. go语言的排序和搜索(转载)
  4. Docker与k8s的恩怨情仇(二)—用最简单的技术实现“容器”
  5. 实现SLIC算法生成像素画
  6. VS 2017 RC .net core ef+ MySql 出现错误
  7. IE浏览器 AjaxForm文件上传错误:Stream ended unexpectedly
  8. Java+Selenium 上传文件,点击选择“浏览文件”按钮,报错invalid argument
  9. NoSql非关系型数据库之MongoDB应用(二):安装MongoDB可视化工具
  10. 【面试】详解同步/异步/阻塞/非阻塞/IO含义与案例