强连通图(tarjan)模板和详解

来一道裸代码。
输入:
一个图有向图。
输出:
它每个强连通分量。

这个图就是刚才讲的那个图。一模一样。

input:

6 8

1 3

1 2

2 4

3 4

3 5

4 6

4 1

5 6

output:

6

5

3 4 2 1

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<algorithm>
#include<map>
#define maxn 200005
using namespace std;
struct node
{
    int v,next;  //v表示指向的点  next表示
}mp[1005];
int DFN[1005],LOW[1005];   //DFN[]作为这个点搜索的次序编号(时间戳)
                           //LOW[]作为每个点在这颗树中的,最小的子树的根,每次保证最小,like它的父亲结点的时间戳这种感觉
int stack[1005],heads[1005],visit[1005],cnt,tot,index;
 // 栈          访问顺序    是否访问
void add(int x,int y)
{
   mp[++cnt].next=heads[x];
   mp[cnt].v=y;
   heads[x]=cnt;
   return ;
}
void tarjan(int x)
{
    DFN[x]=LOW[x]=++tot;  //初始化x
    stack[++index]=x;     //进栈
    visit[x]=1;           //表示x已经入栈
    for(int i=heads[x];i!=-1;i=mp[i].next){
        if(!DFN[mp[i].v])  //如果没有被访问
    {
       tarjan(mp[i].v);  //往下延伸就是递归
       LOW[x]=min(LOW[x],LOW[mp[i].v]);  //递归出来,比较谁是谁的儿子/父亲,就是树的对应关系,涉及到强连通分量子树最小根的事情
    }
    else if(visit[mp[i].v]) //如果访问过,并还在栈里
    {
        LOW[x]=min(LOW[x],DFN[mp[i].v]);  //比较谁是谁的儿子/父亲。就是链接对应关系
    }
    }
    if(LOW[x]==DFN[x]){ //发现整个连通分量子树里的最小根
        while(1)
    {
        cout<<stack[index]<<" ";
        visit[stack[index]]=0;
        index--;
        if(x==stack[index+1]) break; //出栈,并且输出
    }
    cout<<endl;
  }
}
int main()
{
    memset(heads,-1,sizeof(heads));
    int n,m;
    cin>>n>>m;
    int x,y;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        add(x,y);
    }
    for(int i=1;i<=n;i++)
    {
        if(!DFN[i])tarjan(i); //当这个点没有访问过,就从这个点开始,防止图没有走完
    }
    return 0;
}

还有各大理解网站:   (杂着看,就可以看懂)

http://blog.miskcoo.com/2016/07/tarjan-algorithm-strongly-connected-components

https://blog.csdn.net/mengxiang000000/article/details/51672725

https://www.cnblogs.com/yxysuanfa/p/7396057.html

原文地址:https://www.cnblogs.com/huangzzz/p/8922029.html

时间: 2024-08-29 22:03:38

强连通图(tarjan)模板和详解的相关文章

discuz门户首页-header文件模板语法详解和注释

header文件引用了跟多通用模板,所以整个文章会很长,现在比较忙,注释工作会不定期进行 首先开下门户首页的文件 portal里面的index.htm <!--{template common/header}--> //引用common文件下的header.htm这个也是引用模板文件的一种常用方法 <style id="diy_style" type="text/css"></style> //没什么用 <div class

Python - 定制语法的string模板(template) 详解

定制语法的string模板(template) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28614491 string模板(template)参考: http://blog.csdn.net/caroline_wendy/article/details/27054263 string.Template()内添加替换的字符, 使用"$"符号, 或 在字符串内, 使用"${}"; 调用时使

Python - 定制pattern的string模板(template) 详解

定制pattern的string模板(template) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28625179 string.Template的pattern是一个正则表达式, 可以通过覆盖pattern属性, 定义新的正则表达式. 如: 使用新的定界符"{{", 把{{var}}作为变量语法. 代码: # -*- coding: utf-8 -*- ''' Created on 2014.6.5 @

【转载】 Eclipse注释模板设置详解

 Eclipse注释模板设置详解 网站推荐: 金丝燕网(主要内容是 Java 相关) 木秀林网(主要内容是消息队列)

DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解

关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版---------------------------------------------------------基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DLL制作而成.安装之后,直接就可以用了.省心省事.不必再单独的打一次补丁包了.本安装包和补丁包一样都删除了官方自带

POJ 3164 Command Network(最小树形图模板题+详解)

http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p/7136604.html 算法步骤如下: 1.判断图的连通性,若不连通直接无解,否则一定有解. 2.为除了根节点以外的所有点选择一个权值最小的入边,假设用pre数组记录前驱,f数组记录选择的边长,记所选边权和为temp. 3.(可利用并查集)判断选择的的边是否构成环,若没有则直接$ans+=tem

Eclipse注释模板设置详解

设置注释模板的入口:Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素.本文现就每一个元素逐一给大家介绍一下. 文件(Files)注释标签: 1 2 3 4 5 6 7 8 /** * @Title: ${file_name} * @Package ${package_name} * @Description: ${todo}(用一句话描述该文件做什么) * @author $

android自定义UI模板图文详解

不知道大家在实际开发中有没有自定义过UI模板?今天花时间研究了一下android中自定义UI模板,与大家分享一下. 每个设计良好的App都是自定义标题栏,在自定义标题栏的过程中大部分人可能都是自定义一个标题的xml文件,然后在需要的地方直接通过include来引用,这比起在每个布局文件中写标题栏已经进化很多了,但仍然不是最简单有效的方法,我们为什么不能自定义一个标题控件呢?今天就带大家自己做一个标题栏控件.效果图如下: 开始啦: 第一步:自定义xml属性 新建一个android项目,在value

Eclipse最新版注释模板设置详解

设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素啦.现就每一个元素逐一介绍: 文件(Files)注释标签: /** * @Title: ${file_name} * @Package ${package_name} * @Description: ${todo}(用一句话描述该文件做什么) * @author A18ccms A18ccms_gmail_