图的连通性:强连通-Tarjan算法

不早了,先上个模板,做些题再来分析一下;

强连通Tarjan算法+前向星 模板如下:

const int MAXN=110;
const int MAXM=10010;

struct edge
{
    int to,next;
};

edge E[MAXN];
int head[MAXN],Ecou;
int Stack[MAXN],top;
int Belong[MAXN],lfcou;
int Index;
int DFN[MAXN],LOW[MAXN];
bool inStack[MAXN];

void Tarjan(int u)
{
    int v;

    LOW[u]=DFN[u]=++Index;
    Stack[top++]=u;
    inStack[u]=1;
    for(int i=head[u];i!=-1;i=E[i].next)
    {
        v=E[i].to;
        if(!DFN[v])
        {
            Tarjan(v);
            if(LOW[u]>LOW[v])
                LOW[u]=LOW[v];
        }
        else if(inStack[v]&&LOW[u]>DFN[v])
            LOW[u]=DFN[v];
    }
    if(LOW[u]==DFN[u])
    {
        ++lfcou;
        do
        {
            v=Stack[--top];
            inStack[v]=0;
            Belong[v]=lfcou;
        }while(v!=u)
    }
}

void getSCC(int n)
{
    for(int i=1;i<=n;i++)
        if(!DFN[i])
            Tarjan(i);
}

void add_edge(int u,int v)
{
    E[Ecou].to=v;
    E[Ecou].next=head[u];
    head[u]=Ecou++;
}

void init(int n)
{
    Ecou=Index=lfcou=top=0;
    for(int i=1;i<=n;i++)
    {
        inStack[i]=DFN[i]=0;
        head[i]=-1;
    }
}
时间: 2024-07-30 20:24:19

图的连通性:强连通-Tarjan算法的相关文章

CF:Problem 427C - Checkposts强连通Tarjan算法

这题昨晚做了,刚开始看题的时候没想出好法子,然后就看D题了,一看D题发现是后缀数组,然后就把模板改了点就交了上去--不幸的是--WA了,然后重新看题,果然题目看漏了--不仅要用后缀数组和前缀数组求出公共子缀,还要是求最小的,而且在每个串里都不能重复的,这下就想了会不会了,然后看见大帝C过了,然后就重新回来看C了,看了会终于明天怎么做了. C题意:给个图,然后每个点都有权值,求最小的花费及方案数:最小的花费是这样的:因为是建立一个岗哨,然后这个岗哨可以管哪些呢,可以管 i = j 的,或者可以从

CF:Problem 427C - Checkposts强连通 Tarjan算法

tarjan算法第一题 喷我一脸....把手写栈的类型开成了BOOL,一直在找错... #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define maxn 100005 const int MOD=1000000007; using namespace std; struct node { int to,next; }edge[maxn*3]; int

图之强连通、强连通图、强连通分量 Tarjan算法

强连通分量 简介 在阅读下列内容之前,请务必了解图论基础部分. 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图. 这里想要介绍的是如何来求强连通分量. Tarjan 算法 Robert E. Tarjan (1948~) 美国人. Tarjan 发明了很多算法结构.光 Tarjan 算法就有很多,比如求各种联通分量的 Tarjan 算法,求 LCA(Lowest Comm

求图的强连通分量--tarjan算法

一:tarjan算法详解 ?思想: ? ?做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间最早的节点的开始时间.(也就是之后的深搜所能到达的最小开始时间)初始时dfn[i]=low[i] ? ?在DFS过程中会形成一搜索树.在搜索树上越先遍历到的节点,显然dfn的值就越小. ? ?DFS过程中,碰到哪个节点,就将哪个节点入栈.栈中节点只有在其所属的强连通分量已经全部求出时,才会出栈. ?

寻找图的强连通分量:tarjan算法简单理解

1.简介tarjan是一种使用深度优先遍历(DFS)来寻找有向图强连通分量的一种算法. 2.知识准备栈.有向图.强连通分量.DFS. 3.快速理解tarjan算法的运行机制提到DFS,能想到的是通过栈来储存沿途的点,可以找到所有的环.环本身就是联通的,所以环对于强连通分量来说环已经很接近最终答案了.要把找环变成找强连通管分量还要考虑:a.在环外是不是有其他环在这个强连通分量内(极大性) (会被认为是2个环) b.一些不能构成环的点无法被考虑到,而他们本身就是强连通分量 (2不被认为是一个强连通分

强连通分量的Tarjan算法

资料参考 Tarjan算法寻找有向图的强连通分量 基于强联通的tarjan算法详解 有向图强连通分量的Tarjan算法 处理SCC(强连通分量问题)的Tarjan算法 强连通分量的三种算法分析 Tarjan算法详解理解集合 ppt图解分析下载 强连通分量 强连通分量(strongly connected component)是图论中的概念.图论中,强连通图指每一个顶点皆可以经由该图上的边抵达其他的每一个点的有向图.意即对于此图上每一个点对(Va,Vb),皆存在路径Va→Vb以及Vb→Va.强连通

【强连通分量】tarjan算法及kosaraju算法+例题

阅读前请确保自己知道强连通分量是什么,本文不做赘述. Tarjan算法 一.算法简介 Tarjan算法是一种由Robert Tarjan提出的求有向图强连通分量的时间复杂度为O(n)的算法. 首先我们要知道两个概念:时间戳(DFN),节点能追溯到的最早的栈中节点的时间戳(LOW).顾名思义,DFN就是在搜索中某一节点被遍历到的次序号(dfs_num),LOW就是某一节点在栈中能追溯到的最早的父亲节点的搜索次序号. Tarjan算法是基于深度优先搜索的算法.在搜索过程中把没有Tarjan过的点入栈

有向图的强连通分量(tarjan算法)

强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向图的极大强连通子图,称为强连通分量(strongly connected components). 考虑强连通分量C,设其中第一个被发现的点为x,则,C中其他的点都是x的后代.我们希望在x访问完成时立即输出C(可以同时记录C,输出代表

TarJan 算法求解有向连通图强连通分量

[有向图强连通分量] 在有向图G中,如果两个 顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components). 下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达.{5},{6}也分别是两个强连通分量. 大体来说有3中算法Kosaraju,Trajan,Gabow这三种!后续文章中将相继