有向图强连通分支的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 101000 using 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]=;
Stack[++k]=u;
low[u]=dfn[u]=Time++; int v,len=G[u].size(),i; for(i=;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]=;
}while(u!=v);
black++;
}
} int main()
{
int i,j,a,b; while(scanf("%d%d",&n,&m),n+m)
{
Time=;
k=e=black=;
memset(vis,,sizeof(vis));
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(Stack,,sizeof(Stack)); G.clear();
G.resize(n+); for(i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
} Tarjan(); if(e==n && black==)
printf("Yes\n");
else
printf("No\n");
}
return ;
}
有向图强连通分支的Tarjan算法讲解 + HDU 1269 连通图 Tarjan 结题报告的更多相关文章
- tarjan算法讲解。
tarjan算法讲解. 全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关 ...
- (转)全网最!详!细!tarjan算法讲解
byhttp://www.cnblogs.com/uncle-lu/p/5876729.html 全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这 ...
- [转]全网最!详!细!tarjan算法讲解
转发地址:https://blog.csdn.net/qq_34374664/article/details/77488976 原版的地址好像挂了..... 看到别人总结的很好,自己就偷个懒吧..以下 ...
- 【转载】全网最!详!细!tarjan算法讲解。
转自http://www.cnblogs.com/uncle-lu/p/5876729.html [转载]全网最!详!细!tarjan算法讲解.(已改正一些奥妙重重的小错误^_^) 全网最详细tarj ...
- 全网最!详!细!tarjan算法讲解。——转载自没有后路的路
全网最!详!细!tarjan算法讲解. 全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这个,读完一遍,发现原来tarjan这么简单! tarj ...
- tarjan 算法讲解(转)
转自:https://www.byvoid.com/blog/scc-tarjan/ 網誌 列表 標籤 項目 關於 聯繫 四月142009 作者:byvoid 閱讀: 158882 計算機科學 圖論 ...
- TarJan 算法求解有向连通图强连通分量
[有向图强连通分量] 在有向图G中,如果两个 顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的 ...
- 《基于Arm实验箱的国密算法应用》课程设计 结题报告
<基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...
- tarjan算法讲解
tarjan算法,一个关于 图的联通性的神奇算法.基于DFS算法,深度优先搜索一张有向图.!注意!是有向图.根据树,堆栈,打标记等种种神奇方法来完成剖析一个图的工作.而图的联通性,就是任督二脉通不通. ...
随机推荐
- configure PUTTY to not time out
To modify an existing session with "keep alives" to maintain your connection follow the st ...
- apache: 503
Any connection over Max, will get a 503 Service Temporarily Unavailable. 503出现的场景:压测url时,发现大量的503错误. ...
- 推翻自己和过往,重学自定义View
http://blog.csdn.net/lfdfhl/article/details/51671038 深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 A ...
- fdisk添加磁盘
1. 通过Fdisk查看系统分区详细信息: Fdisk –l 详解: [root@jetsenLin ~]# fdisk -l Disk /dev/sda: 10.7 GB, ...
- NaN(Not a Number)问题
Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contai ...
- Simple But Useful Samples About 'grep' Command(简单实用的grep 命令)
Do the following: grep -rnw '/path/to/somewhere/' -e "pattern" -r or -R is recursive, -n i ...
- 如何使用Android中的OpenGL ES媒体效果
引自:http://www.2cto.com/kf/201506/404366.html Android的媒体效果框架允许开发者可以很容易的应用多种令人印象深刻的视觉效果到照片或视频之上.作为这个媒体 ...
- Hibernate 系列教程11-继承-Single Table策略
Single Table策略 通过 discriminator鉴别器来区分是父类还是子类 Employee public class Employee { private Long id; priva ...
- POJ 2182/暴力/BIT/线段树
POJ 2182 暴力 /* 题意: 一个带有权值[1,n]的序列,给出每个数的前面比该数小的数的个数,当然比一个数前面比第一个数小的个数是0,省略不写,求真正的序列.(拗口) 首先想到的是从前到后暴 ...
- [Eclispe] NDK内建include路径修改
[Eclispe] NDK内建include路径修改 编辑 jni/android.mk 中 LOCAL_C_INCLUDES 变量后,该变量值将被列入项目属性的内建include头文件包含路径,无法 ...