HDU 1269 迷宫城堡 (有向图强连通分量Tarjan)

题意:给定有向图,判断是否为强连通图。

思路:方法很简单,直接Tarjan求图强连通分量个数是否为一即可。主要是把Tarjan模板附上来以后好整理。。。

Byvoid的Tarjan算法讲解很详细:https://www.byvoid.com/blog/scc-tarjan/

#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
#define NODENUM 10005
#define EDGENUM 100005
using namespace std;

int N,M;

struct edgenode
{
    int to,next;
}Edge[EDGENUM];
int head[NODENUM],edgenum;

bool in[NODENUM];
stack<int> S;
int rn,dfn[NODENUM],low[NODENUM],index;


void init()
{
    memset(head,-1,sizeof(head));
    memset(in,0,sizeof(in));
    memset(dfn,0,sizeof(dfn));
    index=rn=edgenum=0;
    while(!S.empty()) S.pop();
}

void add(int a,int b)
{
    ++edgenum;
    Edge[edgenum].next = head[a];
    Edge[edgenum].to = b;
    head[a] = edgenum;
}

void build()
{
    while(M--)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        add(a,b);
    }
}

void tarjan(int u)
{
    dfn[u] = low[u] = ++index;
    S.push(u); in[u]=1;
    
    for(int p=head[u];~p;p = Edge[p].next)
    {
        int i = Edge[p].to;
        if(!dfn[i])
        {
            tarjan(i);
            low[u] = min(low[u],low[i]);
        }
        else if(in[i]) low[u] = min(low[u],low[i]);
    }
    
    if(dfn[u] == low[u])
    {
        ++rn;
        int v;
        do
        {
            v = S.top();
            S.pop();
            in[v]=0;
        }
        while(u!=v);
    }
}

void work()
{
    for(int i=1;i<=N;++i)
        if(!dfn[i]) tarjan(i);
    printf("%s\n",rn == 1? "Yes":"No");
}

int main()
{
    while(~scanf("%d %d",&N,&M) && N+M)
    {
        init();
        build();
        work();
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值