Tarjan算法:

Tarjan算法是一种用于查找已知图中的强连通分量的方法(介绍似乎越来越草率了

时间复杂度:O(n+m)//n为点数,m为边数

算法思路

1,首先对每个节点设置两个参数存储:dfn[i]表示第i个点被搜索到的次序编号(每个点的dfn值都不同,low[i]表示每个点在这棵树中的最小子树根(人话就是找爹;

2,对每个新节点,初始化零dfn[i]=low[i];

3,用栈作为容器存储新出现的节点,若这个点有出度,就依次遍历每个子节点,每次都更新最小值保证子树根最小;

4,若找到dfn[i]=low[i],则i为本强连通分量中的根节点,将i及比i后进栈的元素出栈,即为一个强连通分量;

5,应在循环中调用tarjan函数,使每个没被访问过的点都被访问到。

似乎没找到板子题那就自己创造板子吧。

似乎很简单不太用注释的样子(记得要单独开一个数组记录哪些点已经在别的强连通分量中了

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1e4;
int n,m;
int head[N],cnt;
bool vis[N],jilu[N];
int dfn[N],low[N],tot;
struct qwq{int to,nxt;
}e[N];
stack<int> s;
void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
void tarjan(int x){dfn[x]=low[x]=++tot;s.push(x);vis[x]=1;for(ri i=head[x];i;i=e[i].nxt){int v=e[i].to;if(!dfn[v]){tarjan(v);low[x]=min(low[x],low[v]);}else if(vis[v]) low[x]=min(dfn[v],low[x]);}if(low[x]==dfn[x]){for(;;){int u=s.top();s.pop();vis[u]=0,jilu[u]=1;printf("%d ",u);if(u==x) break;}putchar('\n');}
}
int main(){scanf("%d%d",&n,&m);int x,y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);}for(int i=1;i<=n;i++) if(!jilu[i]) tarjan(i);return 0;
}

浅谈Tarjan算法相关推荐

  1. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法

    黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...

  2. 浅谈PPO算法-玩转月球登陆

    浅谈PPO算法-玩转月球登陆 前言 github 什么是Actor-Critic? Actor-Critic代码 ppo算法 实现 前言 总感觉强化学习公式真难学,也难表达心中所想,我还是白话强化学习 ...

  3. 浅谈匈牙利算法(二分图最大匹配)

    前置知识 一张图是二分图,当且仅当它的点可以被分成两部分,而这张图上的所有边的两个端点,都分属不同的部分.我们称这两个点集,一个叫左部,一个叫右部.左部中的点叫左部点:右部中的点叫右部点. 一张图的一 ...

  4. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一   ...

  5. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

  6. 浅谈HASH算法与CSDN密码泄漏事件

    在CSDN密码泄漏事件中,网友评论提到密码的明文保存和MD5保存问题.目前,很多站点都用MD5算法保存密码,但对于HASH(哈希)算法的认识还存在很多误区,很有必要重新认识. 一.HASH算法不是加密 ...

  7. 浅谈ICA算法的概念、本质和流程

    本文转自http://m.elecfans.com/article/699564.html ICA独立成分分析是近年来出现的一种强有力的数据分析工具(Hyvarinen A, Karhunen J, ...

  8. 排序中减治法算法伪代码_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)...

    在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模.今天这篇文章呢,就正式和大家聊一聊 ...

  9. 浅谈Tarjan缩点(分析+模板)

    昨天一看发现我的博客数量到100篇了,撒花✿✿ヽ(°▽°)ノ✿ 根据标题我们也知道,想要在接下来的十分钟不浪费生命 读者需要先行学习Tarjan强联通分量 如果不会的话可以点击这里:https://w ...

  10. 浅谈Stein算法求最大公约数(GCD)的原理及简单应用

    一.Stein算法过程及其简单证明 1.一般步骤: s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k: s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止: ...

最新文章

  1. 简单的实现购物车功能,还有不到位的地方,加油!!!
  2. ListControl 换行行高与字体
  3. 传统网站与Web标准——表格布局实例
  4. 10.15 wget:命令行下载工具
  5. qt调用html里面的函数吗,QT和JS的互相调用例子
  6. 计算机网络:TCP和UDP的对比
  7. macOS下查看Java/JDK的安装目录_查看Java/JDK的版本信息_配置环境变量JAVA_HOME
  8. Python找出某元素的索引下标
  9. pr、ps、ae-安装
  10. 贝叶斯算法详解和拉普拉斯平滑
  11. excel多个工作表合并在一个表
  12. 写易班微信小程序遇到了一点问题
  13. 阿里云数据工厂DataWorks
  14. 禅与 JavaScript 编程艺术, Zen and The Art of JavaScript Programming
  15. C#开发自动照片(图片)裁剪(缩放)工具
  16. 【云和恩墨大讲堂】彭文元 - 中间件BES连接池的配置和问题诊断方法
  17. 单片机C语言中的位运算符,单片机c语言教程第八课 运算符和表达式(位运算符)...
  18. 关于页面请求发起后,通过F12查看到,被挂起页面中stalled花费很长时间问题的追查...
  19. 阿里云域名配置过程记录
  20. STM32硬件SPI控制TM1638 按键数码管LED显示模块

热门文章

  1. matlab傅里叶变换处理图像,MATLAB数字图像处理(1)基本操作和傅里叶变换
  2. latex---插入三线表伪代码流程图
  3. Johnson 算法 洛谷P5905
  4. Matlab遗传算法TSP求解
  5. h5页面判断安卓或ios点击下载App
  6. Cydia 不能联网的终极解决方法
  7. Mac版本Jmeter下载安装教程
  8. Linux从入门到指令详解
  9. 计算机编程英语词汇大全
  10. Windows(11)下JDK安装与环境变量配置