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) {            // 如果没有遍历过那么就dfsdfs(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. [转]全网最!详!细!tarjan算法讲解

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

  2. 全网最详细解释memcached中的flags含义

    前言 复习memcached中,发现很多人对set/add 语法中设置的 flags参数理解不是很透彻, 大家人云亦云. 查资料从来不对别人的材料加以自己的理解写出来,那其实有毛用.百度出来的文章如出 ...

  3. Popular Cows POJ - 2186(tarjan算法)+详解

    题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...

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

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

  5. 【原创】tarjan算法初步(强连通子图缩点)

    [原创]tarjan算法初步(强连通子图缩点) tarjan算法的思路不是一般的绕!!(不过既然是求强连通子图这样的回路也就可以稍微原谅了..) 但是研究tarjan之前总得知道强连通分量是什么吧.. ...

  6. Tarjan算法流程和简要证明

    声明: 一下许多内容摘自: 北京大学暑期课<ACM/ICPC竞赛训练>强连通分支.桥和割点 北京大学信息学院 郭炜 不建议初学者直接看这篇博文 可以先了解一下Tarjan算法的具体流程,再 ...

  7. 双连通图强连通图概念解释以及tarjan算法求解该类问题总结

    最近看了看类的相关题,感觉简单的题过于模板,但是对于难题的转化,如果对与这方面的概念不清楚,很难写,故总结一下. PS:博客里部分内容会和离散数学中的图论知识有联系,如果没有了解过相关知识可能比较难理 ...

  8. 《算法竞赛入门经典》(第二版)代码及详细解释(持续更新!)

    笔者中山大学硕士,医学生+计科学生的集合体,机器学习爱好者. 现发布[刘汝佳<算法竞赛入门经典>(第二版)--紫书]的例题和习题的代码和详细解释. 欢迎批评指正! 另外欢迎关注本人微信公众 ...

  9. SORT跟踪算法的详细解释,不容错过

    转载自:https://blog.csdn.net/HaoBBNuanMM/article/details/85555547 SORT - SIMPLE ONLINE AND REALTIME TRA ...

  10. 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】

    今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现! 话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://b ...

最新文章

  1. hadoop1.2.1伪分布模式配置
  2. Slimming Down Windows XP The Complete Guide 【 10章完整版 】
  3. 【Http】PKIX(PKIX path building failed) 问题 unable to find valid certification path to requested target
  4. 计算机综合应用上机考试题库,2016年计算机上机考试题库
  5. SAP License:SAP学习之COPP
  6. CCF业务总部和学术交流中心落户苏州相城
  7. [2017-10-26]Abp系列——DTO入参验证使用方法及经验分享
  8. JAVA写接口傻瓜(%)教程(五)
  9. ie-此更新不适应于此电脑
  10. 3d建模做一单多少钱?做外包赚钱吗?
  11. 查询和01号的同学学习的课程完全相同的其他同学的信息的优化
  12. Android app后台运行休眠仍然可以运行的方法(确保一直运行)
  13. C#工业物联网和集成系统解决方案的技术路线(数据源、数据采集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)
  14. 《金刚般若波罗蜜经》分段贯释
  15. access文件放置服务器,怎么把access数据库放服务器上
  16. c语言平时成绩占总分多少,平时成绩占多少啊 大学
  17. Flutter 视频播放器组件封装
  18. 工业4.0下IOT融合技术核心OT节点
  19. 关于zedboard无法烧写bit流文件的解决办法
  20. 广东二本计算机专业大学排名及分数线,2021年广东二本大学排名及分数线(完整版)...

热门文章

  1. b2c京东流程图_京东商城网上交易流程分析
  2. 大模型系统和应用——自然语言处理大模型基础
  3. java毕业生简历_一个18年毕业生的Java简历
  4. DP_流水线调度问题与Johnson算法
  5. EXCEL VBA 入门与实用例子
  6. MongoDB MongoVue 客户端
  7. AD9的PCB技巧——封装的更新
  8. 基于Python的周立功CAN上位机(详细教程)
  9. java带圈数字,小1,小2
  10. 图片压缩利器:TinyPNGWrapper