有向图强连通分支的Tarjan算法讲解 + HDU 1269 连通图 Tarjan 结题报告
题目很简单就拿着这道题简单说说 有向图强连通分支的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 结题报告相关推荐
- [转]全网最!详!细!tarjan算法讲解
转发地址:https://blog.csdn.net/qq_34374664/article/details/77488976 原版的地址好像挂了..... 看到别人总结的很好,自己就偷个懒吧..以下 ...
- tarjan算法讲解。
tarjan算法讲解. 全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关 ...
- tarjan算法讲解
时隔好久回来复习tarjan算法,又看了许多网上的文章,在此再给一篇觉得不错的文章:mengxiang000 全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看 ...
- byvoid 神牛的tarjan算法讲解!
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通 (strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图 .非强连通图有向图 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...
- hdu 1269(Tarjan求强连通分量)
这道题目就是求强连通分量... 这里采用的是Tarjan算法:http://m.blog.csdn.net/blog/qq574857122/16361033 AC代码: #include<io ...
- 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱
作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...
- 有向图强连通分量tarjan算法
转自:http://www.byvoid.com/blog/scc-tarjan/ http://blog.csdn.net/geniusluzh/article/details/6601514 在有 ...
- 直观地简单理解Tarjan算法(寻找有向图中的强连通图)
简单理解Tarjan算法 按照百度百科的播报应该是读成['ta:rdʒən]?看过了几篇网络上的解释虽然都讲得比较具体但刚开始都难以理解,所以打算写一个更直观的理解方式. Tarjan算法是求 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...
最新文章
- android学习资料
- 基于redis的悲观锁实现
- 「高并发秒杀」java课程设计报告模板
- AUTHORITY-CHECK
- node服务器放vue项目,本地Vue项目跨域请求本地Node.js服务器的配置方法
- welcome to my blog
- ROS的优势与不足(除了ROS 机器人自主定位导航还能怎么做?)
- 机器闹乌龙?Amphetamine 险遭苹果下架
- 人对光波的三种特性_面试题:常用塑胶材料的特性及用途,你能列出几个?
- 中文核心期刊目录(2008年最新版)
- SolidWorks零件图转工程图
- R语言处理非线性回归模型C-D方程,【译文】R语言非线性回归入门
- 【项目管理】如何定义开放性问题和如何在项目中跟踪开放性问题
- 游戏开发需要具备哪些技术?
- R语言基础作图之点图
- 概述、 BGP AS 、BGP 邻居、 BGP 更新源 、BGP TTL 、BGP路由表、 BGP 同步
- 年末巨献|大数据盛会!企业大数据落地高峰论坛倒计时,速速报名!
- 深度学习 week1 采访部分补充
- 汇通网fx678交易工场是一个骗子集团
- 苹果笔记本android_studio快捷键