美文网首页GraphTheory
tarjan-寻找图中有多少个强连通分量

tarjan-寻找图中有多少个强连通分量

作者: 雨落八千里 | 来源:发表于2019-06-12 20:40 被阅读3次

tarjan寻找图中有多少个强连通分量

hdu 1269 迷宫城堡
判断图否是属于一个强连通分量

#include<bits/stdc++.h>
#define M 100100
using namespace std;
struct node
{
      int v;
      int next;
}edge[M];
int n,m,head[M];
int vis[M],low[M],dfn[M],cnt,tot;
int sig;
stack <int>s;
void add(int x,int y)
{
      edge[++cnt].next=head[x];
      edge[cnt].v=y;
      head[x]=cnt;
      return ;
}
void tarjan(int x)
{
      dfn[x]=low[x]=++tot;
      s.push(x);
      vis[x]=1;
      for(int i=head[x];i!=-1;i=edge[i].next)
      {
            if(!dfn[edge[i].v])
            {
                  tarjan(edge[i].v);
                  low[x]=min(low[x],low[edge[i].v]);
            }
            else if(vis[edge[i].v])
            {
                  low[x]=min(low[x],dfn[edge[i].v]);
            }
      }
      if(low[x]==dfn[x])
      {
            sig++;
            int k;
            do
            {
                  k=s.top( );
                  vis[k]=0;
                  s.pop();
            }while(x!=k);
      }
      return ;
}
int main( )
{
      int x,y;
      while(~scanf("%d%d",&n,&m)&&(m+n))
      {
            memset(head,-1,sizeof(head));
            memset(vis,0,sizeof(vis));
            memset(dfn,0,sizeof(dfn));
            memset(low,0,sizeof(low));
            cnt=tot=sig=0;
            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);
                  }
            }
            if(sig==1)
            {
                  cout<<"Yes"<<endl;
            }
            else
            {
                  cout<<"No"<<endl;
            }
      }
      return 0;
}

相关文章

  • tarjan-寻找图中有多少个强连通分量

    tarjan寻找图中有多少个强连通分量 hdu 1269 迷宫城堡判断图否是属于一个强连通分量

  • tarjan

    tarjan:寻找出度为0的强连通分量,并求出该强连通分量中有多少个点。 sig表示的是强连通分量的个数其中col...

  • 数据结构与算法--图论之寻找连通分量、强连通分量

    数据结构与算法--图论之寻找连通分量、强连通分量 寻找无向图的连通分量 使用深度优先搜索可以很简单地找出一幅图的所...

  • tarjan

    tarjan寻找出度为0的强连通分量,从小到大输出此强连通分量中的点 poj 2553 The Bottom of...

  • 强连通分量和Kosaraju算法

    内容概要: 基于深度优先后序遍历的DAG图拓扑排序 强连通分量 求解强连通分量Kosaraju算法 拓扑排序的另一...

  • 图的连通性

    一、连通分量 1.1 定义 连通分量是针对无向图的,无向图G的极大连通子图称为G的连通分量( Connected ...

  • 活动分组——无向图的连通分量个数

    一、相关概念 连通分量 无向图中,极大连通子图称为连通分量1)连通图的连通分量只有一个,即自身2)非连通的无向图有...

  • Tarjan算法求强连通分量

    首先先要明确概念:强连通图意为在该图中任意两点间都能够相互到达,而强连通分量即为一个强连通图中的子图,如图中{1,...

  • 几个概念:有向图、无向图、加权图、简单图、联通、联通分量、生成树、强连通分量、强联通图图的存储:邻接矩阵(二维、一...

  • Kosaraju算法详解

    Kosaraju算法是干什么的? Kosaraju算法可以计算出一个有向图的强连通分量 什么是强连通分量? 在一个...

网友评论

    本文标题:tarjan-寻找图中有多少个强连通分量

    本文链接:https://www.haomeiwen.com/subject/dtvrfctx.html