HDU 1269 强连通模板 Tarjan算法

求强连通量,为1输出Yes否则No

Tarjan算法模板

具体讲解:https://www.byvoid.com/zht/blog/scc-tarjan

#include "stdio.h"
#include "string.h"

struct Edge
{
    int v,next;
}edge[100010];

int head[10010],stack[10010],dfn[10010],low[10010];
// stack栈; dfn深搜次序数组;low结点或者子树节点所能追溯到的最早栈中的标记数组
int instack[10010];
// 标记是否还在栈中
int n,m,cnt,scnt,tot,top;

void init()
{
    cnt=0;
    scnt=top=tot=0; //  初始化连通分量标号,次序计数,栈顶指针
    memset(head,-1,sizeof(head));
    memset(dfn,0,sizeof(dfn)); // 结点搜索的次序编号数组
}

void add(int u,int v)
{
    edge[tot].v=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}

void Tarjan(int w)
{
    int i,v,t;
    dfn[w]=low[w]=++tot;
    instack[w]=1;
    stack[top++]=w;
    for (i=head[w];i!=-1;i=edge[i].next)
    {
        v=edge[i].v;
        if (dfn[v]==0)
        {
            Tarjan(v);
            if (low[w]>low[v]) // 更新结点W所能到达的最小次数层
                low[w]=low[v];
        }
        else
        if (instack[v] && dfn[v]<low[w])
            low[w]=dfn[v];
    }
    if (dfn[w]==low[w]) // 如果结点W是强连通分量的根
    {
        scnt++; // 连通分量标号+1
        do
        {
            t=stack[--top]; // 退栈
            instack[t]=0;
        }while (t!=w);
    }
}

void solve()
{
    int i;
    for (i=1;i<=n;i++)
        if (dfn[i]==0)
            Tarjan(i);
}
int main()
{
    int u,v;
    while (scanf("%d%d",&n,&m)!=EOF)
    {
        if (n+m==0) break;
        init();
        while (m--)
        {
            scanf("%d%d",&u,&v);
            add(u,v);
        }

        solve();
        if (scnt==1) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 09:32:46

HDU 1269 强连通模板 Tarjan算法的相关文章

HDU 1269 强连通分量tarjan算法

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6655    Accepted Submission(s): 2973 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房

HDU 1269 迷宫城堡 tarjan算法求强连通分量

基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等,那这个点就在一个强连通分量里面,此时从栈中向外取出元素,知道取出的元素与这个点的值相等时结束,我们所有取出的点与这个点在同一个强连通分量里.下面是代码,其实代码里本来不需要id数组记录点属于哪个强连通分量的,因为题目没有做要求,但是为了保留模板完整还是带着了,以供以后复习使用. #include<c

[ACM] HDU 1269 迷宫城堡(Tarjan算法求强联通分量)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8099    Accepted Submission(s): 3623 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

Hdu 1269 强连通判定

题目链接 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7097    Accepted Submission(s): 3159 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道

图之强连通、强连通图、强连通分量 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过程中,碰到哪个节点,就将哪个节点入栈.栈中节点只有在其所属的强连通分量已经全部求出时,才会出栈. ?

poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】

题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27496   Accepted: 11059 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows

图论-强连通分量-Tarjan算法

有关概念: 如果图中两个结点可以相互通达,则称两个结点强连通. 如果有向图G的每两个结点都强连通,称G是一个强连通图. 有向图的极大强连通子图(没有被其他强连通子图包含),称为强连通分量.(这个定义在百科上和别的大神的博客中不太一样,暂且采用百科上的定义) Tarjan算法的功能就是求有向图中的强连通分量 思路: 定义DFNi存放访问到i结点的次序(时间戳),Lowi存放i结点及向i下方深搜到的结点中能追溯到的访问次序最小的结点的访问次序(即这些结点回溯上去能找到的最小的DFN值),找到未被访问

强连通分量Tarjan算法模板

#include<map> #include<set> #include<cmath> #include<stack> #include<queue> #include<cstdio> #include<string> #include<vector> #include<cstring> #include<iomanip> #include<sstream> #include