题目很简单就拿着这道题简单说说 有向图强连通分支的Tarjan算法

有向图强连通分支的Tarjan算法伪代码如下:
void Tarjan(u) {
dfn[u]=low[u]=++index//进行DFS,每发现一个新的点就对这个点打上时间戳,所以先找到的点时间戳越早,dfn[U]表示最早发现u的时间,low[u]表示u能到达的最早的时间戳。
stack.push(u)//将U压入栈中
for each (u, v) in E {
if (v is not visted)//如果V点没有经历过DFS,则对V点进行搜索

{
tarjan(v)
low[u] = min(low[u], low[v]) //因为U和V连接,所以V能到达的最早的时间戳,U一定可以到达,比较后取小值。
}
else if (v in stack)//如果V点已经在栈中了,那么比较dfn[V]和low[u]后取小值

{
low[u] = min(low[u], dfn[v])
}
}
if (dfn[u] == low[u]) { //u是一个强连通分量的根
repeat
v = stack.pop
print v
until (u== v)
} //退栈,把整个强连通分量都弹出来
} //复杂度是O(E+V)的

下面贴出HDU1269的代码,这是道很基础的模板题。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0xfffffff
#define MAX 101000using namespace std;int n,m,k,Time,vis[MAX],low[MAX],dfn[MAX],black,e,Stack[MAX];vector<vector<int> >G;void Tarjan(int u)
{vis[u]=1;Stack[++k]=u;low[u]=dfn[u]=Time++;int v,len=G[u].size(),i;for(i=0;i<len;i++){v=G[u][i];if(!dfn[v]){Tarjan(v);low[u]=min(low[u],low[v]);}else if(vis[v]){low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){do{v=Stack[k--];e++;vis[v]=0;}while(u!=v);black++;}
}int main()
{int i,j,a,b;while(scanf("%d%d",&n,&m),n+m){Time=1;k=e=black=0;memset(vis,0,sizeof(vis));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(Stack,0,sizeof(Stack));G.clear();G.resize(n+1);for(i=1;i<=m;i++){scanf("%d%d",&a,&b);G[a].push_back(b);}Tarjan(1);if(e==n && black==1)printf("Yes\n");elseprintf("No\n");}return 0;
}

View Code

转载于:https://www.cnblogs.com/alan-W/p/5672040.html

有向图强连通分支的Tarjan算法讲解 + HDU 1269 连通图 Tarjan 结题报告相关推荐

  1. [转]全网最!详!细!tarjan算法讲解

    转发地址:https://blog.csdn.net/qq_34374664/article/details/77488976 原版的地址好像挂了..... 看到别人总结的很好,自己就偷个懒吧..以下 ...

  2. tarjan算法讲解。

    tarjan算法讲解.   全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关 ...

  3. tarjan算法讲解

    时隔好久回来复习tarjan算法,又看了许多网上的文章,在此再给一篇觉得不错的文章:mengxiang000 全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看 ...

  4. byvoid 神牛的tarjan算法讲解!

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通 (strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图 .非强连通图有向图 ...

  5. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  6. hdu 1269(Tarjan求强连通分量)

    这道题目就是求强连通分量... 这里采用的是Tarjan算法:http://m.blog.csdn.net/blog/qq574857122/16361033 AC代码: #include<io ...

  7. 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱

    作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...

  8. 有向图强连通分量tarjan算法

    转自:http://www.byvoid.com/blog/scc-tarjan/ http://blog.csdn.net/geniusluzh/article/details/6601514 在有 ...

  9. 直观地简单理解Tarjan算法(寻找有向图中的强连通图)

    简单理解Tarjan算法   按照百度百科的播报应该是读成['ta:rdʒən]?看过了几篇网络上的解释虽然都讲得比较具体但刚开始都难以理解,所以打算写一个更直观的理解方式.   Tarjan算法是求 ...

  10. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

最新文章

  1. android学习资料
  2. 基于redis的悲观锁实现
  3. 「高并发秒杀」java课程设计报告模板
  4. AUTHORITY-CHECK
  5. node服务器放vue项目,本地Vue项目跨域请求本地Node.js服务器的配置方法
  6. welcome to my blog
  7. ROS的优势与不足(除了ROS 机器人自主定位导航还能怎么做?)
  8. 机器闹乌龙?Amphetamine 险遭苹果下架
  9. 人对光波的三种特性_面试题:常用塑胶材料的特性及用途,你能列出几个?
  10. 中文核心期刊目录(2008年最新版)
  11. SolidWorks零件图转工程图
  12. R语言处理非线性回归模型C-D方程,【译文】R语言非线性回归入门
  13. 【项目管理】如何定义开放性问题和如何在项目中跟踪开放性问题
  14. 游戏开发需要具备哪些技术?
  15. R语言基础作图之点图
  16. 概述、 BGP AS 、BGP 邻居、 BGP 更新源 、BGP TTL 、BGP路由表、 BGP 同步
  17. 年末巨献|大数据盛会!企业大数据落地高峰论坛倒计时,速速报名!
  18. 深度学习 week1 采访部分补充
  19. 汇通网fx678交易工场是一个骗子集团
  20. 苹果笔记本android_studio快捷键

热门文章

  1. FireEye:K3chang行动***欧洲外交部门
  2. PHP设计模式——职责链模式
  3. PHP设计模式——迭代器模式
  4. Linux系统编程二:字符设备控制之点亮LED灯、控制蜂鸣器
  5. 深入理解Core Data
  6. Atitit.uml2 api 的编程代码实现设计uml开发 使用eclipse jar java 版本
  7. Android 微信分享信息
  8. 大龄屌丝自学笔记--Java零基础到菜鸟--006
  9. hdu 4351 Digital root
  10. aspnet ajax 1.0中的according控件