做题时又遇到了疑惑,说明一开始就没有完全理解

基于dfs的tarjan,搜索时会有四种边

树枝边:DFS 时经过的边,即 DFS 搜索树上的边
前向边:与 DFS 方向一致,从某个结点指向其某个子孙的边
后向边:与 DFS 方向相反,从某个结点指向其某个祖先的边
横叉边:从某个结点指向搜索树中另一子树中的某结点的边

Low(u)为 u 或 u 的子树( 经过最多一条后向边或栈中横叉边) 能够回溯到的最早的栈中结点的次序号。

Low(u)=Min
{
DFN(u),
Low(v),(u,v)为树枝边, u 为 v 的父结点
DFN(v),(u,v)为后向边或指向栈中结点的横叉边
}

所以做更新时要判断边的类别

这篇博客讲的很棒了

https://blog.csdn.net/qianguch/article/details/54710272

所以我在做这道题目的时候,对栈内栈外的没有考虑,所以出错了

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string.h>
  4. #define inf (1 << 30)
  5.  
  6. using namespace std;
  7. const int maxn = 5500;
  8. const int maxm = 50500;
  9. struct node{
  10. int to,pre;
  11. }e[maxm];
  12. int dfn[maxn],low[maxn];
  13. int color[maxn],col;
  14. int id[maxn],cnt;
  15. int idx;
  16. int stk[maxn],s_cnt;
  17. int n,m;
  18. int out[maxn];
  19. bool instk[maxn];
  20. void init()
  21. {
  22. memset(id,-1,sizeof(id));
  23. memset(dfn,0,sizeof(dfn));
  24. memset(low,0,sizeof(low));
  25. memset(color,0,sizeof(color));
  26. memset(out,0,sizeof(out));
  27. memset(instk,0,sizeof(instk));
  28. col = idx = cnt = s_cnt = 0;
  29. }
  30.  
  31. void add(int u,int v)
  32. {
  33. e[cnt].to = v;
  34. e[cnt].pre = id[u];
  35. id[u] = cnt++;
  36. }
  37.  
  38. void tarjan(int u,int fa)
  39. {
  40. dfn[u] = low[u] = ++idx;
  41. stk[s_cnt++] = u;
  42. instk[u] = 1;
  43.  
  44. for(int i = id[u];~i;i = e[i].pre)
  45. {
  46. int v = e[i].to;
  47. if(!dfn[v])
  48. {
  49. tarjan(v,u);
  50. low[u] = min(low[u],low[v]);
  51. }
  52. else if(instk[v])//此时表示已经更新过了
  53. {
  54. low[u] = min(low[u],dfn[v]);
  55. }
  56. }
  57. if(dfn[u] == low[u])
  58. {
  59. col++;
  60. while(s_cnt > 0 && stk[s_cnt] != u)
  61. {
  62. --s_cnt;
  63. color[stk[s_cnt]] = col;
  64. instk[stk[s_cnt]] = 0;
  65. }
  66. }
  67. }
  68.  
  69. int main()
  70. {
  71. int u,v;
  72. while(~scanf("%d",&n),n)
  73. {
  74. scanf("%d",&m);
  75. init();
  76. for(int i = 1;i <= m;i++)
  77. {
  78. scanf("%d%d",&u,&v);
  79. add(u,v);
  80. }
  81.  
  82. for(int i = 1;i <= n;i++)
  83. {
  84. if(!dfn[i])
  85. tarjan(i,-1);
  86. }
  87.  
  88. for(int i = 1;i <= n;i++)
  89. {
  90. for(int j = id[i];~j;j = e[j].pre)
  91. {
  92. int to = e[j].to;
  93. if(color[i] != color[to])
  94. {
  95. ++out[color[i]];
  96. }
  97. }
  98. }
  99. bool flag = 1;
  100. for(int i = 1;i <= n;i++)
  101. {
  102. if(!out[color[i]])
  103. {
  104. if(flag)
  105. printf("%d",i),flag = 0;
  106. else
  107. printf(" %d",i);
  108. }
  109. }
  110. printf("\n");
  111. }
  112. return 0;
  113. }

tarjan算法的补充POJ2533tarjan求度的更多相关文章

  1. Tarjan算法打包总结(求强连通分量、割点和Tarjan-LCA)

    目录 Tarjan打包总结(求强连通分量.割点和Tarjan-LCA) 强连通分量&缩点 原理 伪代码 板子(C++) 割点 原理 伪代码 最近公共祖先(LCA) 原理 伪代码 板子 Tarj ...

  2. tarjan算法-解决有向图中求强连通分量的利器

    小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...

  3. tarjan算法+缩点:求强连通分量 POJ 2186

    强连通分量:1309. [HAOI2006]受欢迎的牛 ★★   输入文件:cow.in   输出文件:cow.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 每一头牛 ...

  4. [Tarjan系列] Tarjan算法求无向图的桥和割点

    RobertTarjan真的是一个传说级的大人物. 他发明的LCT,SplayTree这些数据结构真的给我带来了诸多便利,各种动态图论题都可以用LCT解决. 而且,Tarjan并不只发明了LCT,他对 ...

  5. 图论-强连通分量-Tarjan算法

    有关概念: 如果图中两个结点可以相互通达,则称两个结点强连通. 如果有向图G的每两个结点都强连通,称G是一个强连通图. 有向图的极大强连通子图(没有被其他强连通子图包含),称为强连通分量.(这个定义在 ...

  6. Tarjan算法初步

    一.前置知识: 强连通分量:有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(stron ...

  7. [知识点]Tarjan算法

    // 此博文为迁移而来,写于2015年4月14日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxnx.html UPD ...

  8. Tarjan算法 详解+心得

    Tarjan算法是由Robert Tarjan(罗伯特·塔扬,不知有几位大神读对过这个名字) 发明的求有向图中强连通分量的算法. 预备知识:有向图,强连通. 有向图:由有向边的构成的图.需要注意的是这 ...

  9. Tarjan 算法 自学整理

    算法介绍 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量( ...

随机推荐

  1. Python.Books

    Flask 1. Flask Web Development Miguel Grinberg April 2014 2. Flask Framework Cookbook Shalabh Aggarw ...

  2. 谁说delphi没有IOCP库,delphi新的IOCP类库,开源中

    DIOCP Demo说明 下载地址 https://code.google.com/p/diocp/ 特地为DIOCP开设了一个群:320641073,欢迎学习的IOCP的童鞋进入讨论. 核心作者:  ...

  3. 拍照一分钟,修图两小时,PS大神是这样修片的!

    乌克兰有一个叫Viktoria Solidarnyh的美图艺术家,这个艺术家有一个特别的技能——P图,她P的图,水平真的非常赞...来感受一下.... 瞬间变成魔幻田园风... 编辑:千锋UI设计 ​ ...

  4. PHP图片处理库Grafika详细教程

    转载自51CTO 开发频道 1.图像基本处理:http://developer.51cto.com/art/201611/520928.htm 2.图像特效处理模块:http://developer. ...

  5. 在vue中的点击事件怎么获取当前点击的元素

    首先 vue的点击事件 是用 @click = “clickfun()” 属性 在html中绑定的,在点击的函数中 添加$event 参数就可以比如<button @click = “click ...

  6. Python3实战系列之四(获取印度售后数据项目)

    问题:续接上一篇.说干咱就干呀,勤勤恳恳写程序呀! 目标:此篇开始进入正题了.为实现我们整个项目功能而开始实现各个子模块功能.首先实现第一篇列出的分步功能模块的第一步: 1.python访问ftp,下 ...

  7. ajax的基础

    去年也是这个时候,开始学了ajax,也是这个技术领我走上了网页制作的道路,于是这样感觉到手写html比之前的dw拖拖拽拽要有意思得多. 话不多说,下面是一个例子: 这个是ajax显示页面:index. ...

  8. Tomcat优化详细1

    在Tomcat和应用程序进行了压力测试后,如果您对应用程序的性能结果不太满意,就可以采取一些性能调整措施了,当然了前提是应用程序没有问题,我们这里只讲Tomcat的调整.由于Tomcat的运行依赖于J ...

  9. WCF 与 Windows Store Client App

    首先复习下WCF: WCF实际上是构建了一个框架,这个框架实现了在互联系统中各个Application之间如何通信.使得Developers和Architect在构建分布式系统中,无需在考虑如何去实现 ...

  10. Python开课复习-10/17

    pickle是一个用来序列化的模块序列化是什么?指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上 反序列化?将硬盘上存储的中间格式数据在还原为内存中的数据结构 为什么要序列化?就是为了将数据 ...