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

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概念 强联通:如果有向图中两个点vi和vj,其中vi到vj之间有一条有向路径,vj到vi有一条有向路径,则称vi,...
    idella阅读 955评论 0 0
  • 无向图中求割点集和割边集——Tarjan算法割点和割边定义在一个无向图中,如果删除了某个顶点及与之相连的所有边,产...
    Herixth阅读 13,595评论 3 8
  • 在最近学习中遇到了几次题解使用Tarjan的情况,便查了一些资料。 算法简介 一种由Robert Tarjan提出...
    vfence阅读 1,649评论 0 1
  • 首先先要明确概念:强连通图意为在该图中任意两点间都能够相互到达,而强连通分量即为一个强连通图中的子图,如图中{1,...
    Ricardo_Y_Li阅读 3,222评论 0 2
  • 在一次BFS或DFS中,我们其实并不能保证一定访问到图中的所有节点,因为有些图可能是不连通的。我们把从一个点出发,...
    maxkibble阅读 685评论 0 1

友情链接更多精彩内容