全网最详细解释tarjan算法

Tarjan算法详解(AcWing 1174 受欢迎的牛) 题目描述: 每一头牛的愿望就是变成一头最受欢迎的牛。 现在有 N 头牛,编号从 1 到 N,给你 M 对整数 (A,B),表示牛 A 认为牛 B 受欢迎。 这种关系是具有传递性的,如果 A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛 C 受欢迎。 你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。 输入格式 第一行两个数 N,M; 接下来 M 行,每行两个数 A,B,意思是 A 认为 B 是受欢迎的(给出的信息有可能重复,即有可能出现多个 A,B)。 输出格式 输出被除自己之外的 阅读详情

tarjan算法

tarjan算法是为了计算强连通分量的

强连通分量也就是在有向图当中,能够双方都能够到达对方的点集

视频链接

代码实现

#include <bits/stdc++.h>
using namespace std;
int times = 1;    // 时间搓
stack<int> st;    // 栈
vector<int> dfn;  // 访问的时间点
vector<int> low;  // 能够回溯到的最小时间点

vector<vector<int>> ans;

bool isinstack(int val) {
  stack<int> tmp = st;
  while (!tmp.empty()) {
    if (tmp.top() == val) {
      return true;
    }
    tmp.pop();
  }
  return false;
}

int calsize(vector<int>& data) {
  int ans = 0;
  for (int i = 0; i < data.size(); i++) {
    for (int j = i + 1; j < data.size(); j++) {
      ans++;
    }
  }
  return ans;
}

void dfs(map<int, vector<int>>& mp, int v) {
  // 先进来以后,先把这个访问点标记
  dfn[v] = times;
  low[v] = times;
  times++;
  st.push(v);
  auto vec = mp[v];
  for (int i = 0; i < vec.size(); i++) {  // 保证都可以访问到
    if (dfn[vec[i]] == 0) {               // 如果没有访问过,这个相当于c->d的情况当d的更新完以后更新c的
      dfs(mp, vec[i]);
      low[v] = min(low[v], low[vec[i]]);
    } else if (isinstack(vec[i])) {       // 这个相当于d->b的情况,发现b在栈里面,进行更新成<5,2>
      low[v] = min(low[v], low[vec[i]]);
    }
  }
  // 后续遍历

  if (dfn[v] == low[v])  {
    vector<int> tmp;
    while (st.top() != v) {
      tmp.push_back(st.top());
      st.pop();
    }
    tmp.push_back(st.top());
    st.pop();
    ans.push_back(tmp);
  }
}

int main() {
  // 开始构建有向图
  int N, M;
  cin >> N >> M;
  map<int, vector<int>> mp;
  for (int i = 0; i < M; i++) {
    int x, y;
    cin >> x >> y;
    if (x == y) {
      continue;
    }
    mp[x].push_back(y);
  }
  // cout << "data" << endl;
  // for (auto c : mp) {
  //   cout << c.first << endl;
  //   for (auto b : c.second) {
  //     cout << b << endl;
  //   }
  // }

  dfn.resize(N + 1, 0);
  low.resize(N + 1, 0);

  for (int i = 1; i <= N; i++) {  // 遍历所有的顶点
    if (dfn[i] == 0) {            // 如果没有遍历过那么就dfs
      dfs(mp, i);
    }
  }

  int size = 0;
  for (auto a : ans) {
    size += calsize(a);
  }
  cout << size << endl;

  // for (auto a : ans) {
  //   for (auto b : a) {
  //     cout << b << " ";
  //   }
  //   cout << endl;
  // }
  // cout << endl;
}
Tarjan算法详解 目录一、什么是强连通分量1. 概念2. 强连通分量二、两种dfs遍历1. 方式12. 方式2三、一个简单例子理解算法四、更完整的一个例子五、Code实现 一、什么是强连通分量 tarjan强连通分量算法 1. 概念 连通:无向图中,从任意点i可到达任一点j 强连通:有向图中,从任意点i可到达任一点j 弱连通:把有向图看作无向图时,从任意点i可到达任一点j 如图,强连通无论那个点,都能按照方向到达任意一点,弱连通如果强行按方向,那么B到不了C,A到不了B和C,C到不了B。但如果把他看作是无向图,那么他们也 阅读详情

相关推荐

算法学习笔记(Tarjan)

本文介绍Tarjan求强联通分量、找割点和割边、找环。

qq_74405082的博客 2180

浅谈 Tarjan 算法

无向图中,若删去一条边会使得这个图的极大连通分量数增加,则该边被称为桥。也可以理解为无向图的一个连通块中,若删除一条边会使得至少两点之间无法相互到达,该边被称为桥。无向图中,若删去一个点会使得这个图的极大连通分量数增加,这个点被称为割点。也可以理解为无向图的一个连通块中,若删除一个点会使得至少两点之间无法相互到达,该点被称为割点。注意,强连通分量(SCC,Strongly Connected Components)是在单向图中的。强联通子图,定义为:在单向图中,该子图上的任意两点之间能互相到达。

William_Wang_的博客 5220

tarjan 算法求强连通分量

转自大牛 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关于 图的联通性的神奇算法。基于DFS(迪法师)算法,深度优先搜索一张有向图。!注意!是有向图。根据树,堆栈,打标记等种种神(che)奇(dan)方法来完成剖析一个图的工作。而图的联通性,就是

Marcus-Bao的个人主页 932

Tarjan算法超超超详解(ACM/OI)(强连通分量/缩点)(图论)(C++)

深入浅出的Tarjan算法手把手讲解!看完就会!

qaqwqaqwq的博客 1万+

P+F--r2000激光雷达slam技术实现

P+F--r2000激光雷达slam技术实现

majingming123的博客 1667

EBS开发_创建AP付款

--以下代码于20181002在Tony环境测试通过 /* BEGIN   --mo_global.init('SQLAP');   apps.fnd_global.apps_initialize(user_id =&gt; 1110, resp_id =&gt; 50597, resp_appl_id =&gt; 20003);   --mo_global.set_policy_context(...

蜗牛先生快跑的博客 4767

Tarjan算法详细讲解

Tarjan算法讲解的博客网上找到三篇比较好的,现在都转载了,个人只研究了第一篇,正如博主所说,讲的标比较详细,清晰,剩下两篇也可以看一下. 卿学姐视频讲解https://www.bilibili.com/video/av7330663/ 以下内容转自:http://www.cnblogs.com/uncle-lu/p/5876729.html 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单! ...

木牛的博客 1万+

SVPWM分析、各个扇区详细计算以及Matlab仿真

SVPWM分析以及各个扇区详细计算以及Matlab仿真说明目的两电平逆变器拓扑空间矢量扇区判断扇区内如何发波?矢量作用时间计算矢量切换时间的计算Simulink仿真/基于Matlab-R2014a版本 说明 第一次发文章,不太会用Markdown,word编辑的公式复制过来有些是乱码,因此都贴图了。 另外,本文公式和图片比较多,编辑工作量比较大,比较辛苦,转载的话,请注明出处,谢谢。 目的 由于在...

michaelf的博客 12万+

全网最!详!细!Tarjan算法讲解。

Tarjan算法讲解的博客网上找到三篇比较好的,现在都转载了,个人只研究了第一篇,正如博主所说,讲的标比较详细,清晰,剩下两篇也可以看一下. 以下内容转自:http://www.cnblogs.com/uncle-lu/p/5876729.html 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这

AC_Dreameng 2万+

STM32F4XX软件模拟I2C实现MPU6050姿态数据采集

本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。

butter的博客 678

HTML流光爱心(完整代码)

HTML语言实现红蓝色流光爱心效果的完整代码。

AIGC 1万+

全网最!详!细!tarjan算法讲解

转自:点击打开 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关于 图的联通性的神奇算法。基于DFS(迪法师)算法,深度优先搜索一张有向图。!注意!是有向图。根据树,堆栈,打标记等种种神(che)奇(dan)方法来完成剖析一个图的工作。而图的联通性,就是任督二

K键盘里的青春K 8万+

华为OD机试 - 音乐小说内容重复识别 - 并查集(Java 双机位C卷 200分)

华为OD机试 双机位C卷题库疯狂收录中,刷题。

学Java,找哪吒 159

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

转发地址:https://blog.youkuaiyun.com/qq_34374664/article/details/77488976原版的地址好像挂了..... 看到别人总结的很好,自己就偷个懒吧。。以下为转发内容 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算...

weixin_30587927的博客 109

KMD 核心功能模块——命令提交与调度:Ring Buffer 与硬件引擎交互

《KMD 中的中断与同步机制——从 Fence 到 Timeline Semaphore 的深度解析》GPU 需要持续接收命令,但硬件执行是流式处理。Ring Buffer 作为。导致 CVE-2022-1234(GPU 挂起),修复后强制检查。:命令提交延迟从 50μs 降至 5μs(20 倍提升)。,CPU 通过写入该地址更新指针(避免直接操作寄存器)。,实现 CPU 与 GPU 的高效协同。),GPU 读指针更新是硬件自动完成的。(通过硬件状态机),实现真正的零等待。AMDGPU 驱动曾因。

amy_mhd的博客 83

YOLOv11低照度增强主干网络PE-YOLO:原理与完整实现教程

编码器部分# 解码器部分self.dec_conv2 = nn.Conv2d(512, 128, 3, padding=1) # 跳跃连接self.dec_conv3 = nn.Conv2d(256, 64, 3, padding=1) # 跳跃连接self.dec_conv4 = nn.Conv2d(128, 32, 3, padding=1) # 跳跃连接# 编码路径# 解码路径(带跳跃连接)

FJN110的博客 725

全网最最详细!一文讲懂Tarjan算法求强连通分量&缩点

网上看了几篇博客,还有OI Wiki,觉得整合度不够,于是特意写了篇博客。 参考资料: 全网最!详!细!Tarjan算法讲解。 强连通分量(SCC)与缩点 强连通分量 - OI Wiki 正文 在学习强连通分量和缩点之前,请务必理解邻接表。 以下有OI Wiki的内容,有大佬博客里的内容,也有我自己的内容。 强连通分量 引入 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通。 强连通分量(Strongly Connected Components,简称SCC)的定义是:极大的强连通子图。 举一

淼畔 的博客 1108

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Tarjan算法流程和简要证明

声明:一下许多内容摘自: 北京大学暑期课《ACM/ICPC竞赛训练》强连通分支、桥和割点 北京大学信息学院 郭炜不建议初学者直接看这篇博文 可以先了解一下Tarjan算法的具体流程,再来看证明。 推荐:全网最!详!细!tarjan算法讲解强连通分量如果有向图G的每两个顶点都强连通,称G为强连通图。 非强连通图有向图的极大强连通子图,称为强连通分量。算法流程DFN[i]表示 遍历到 i 点时是

ONE MORE TRY 2124

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Tarjan算法

转自:传送门 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关于 图的联通性的神奇算法。基于DFS(迪法师)算法,深度优先搜索一张有向图。!注意!是有向图。根据树,堆栈,打标记等种种神(che)奇(dan)方法来完成剖析一个图的工作。而图的联通性,就是任督二脉通不通。。的...

菜鸡的博客 337

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

全网最!详!细!tarjan算法讲解。

转载博客链接:传送门 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关于 图的联通性的神奇算法。基于DFS(迪法师)算法,深度优先搜索一张有向图。!注意!是有向图。根据树,堆栈,打标记等种种神(che)奇(dan)方法来完成剖析一个图的工作。而图的联通性,就是任督二脉通不

nhl19961226的博客 445

tarjan算法讲解。

tarjan算法讲解。 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关于 图的联通性的神奇算法。基于DFS(迪法师)算法,深度优先搜索一张有向图。!注意!是有向图。根据树,堆栈,打标记等种种神(che)奇(dan)方法来完成剖析一个图的工作。而图...

aids78711的博客 231
上一篇: linux零拷贝技术
下一篇: 多线程顺序执行实现方式
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值