hdu 1269 (强连通基础图)

//Tarjan算法模板题,求出强连通分量,如果是1,所有的房间两两相连



#include<stdio.h>
#include<stack>
using namespace std;
int n,m,dfs[100001],low[100002],ins[100002];
struct edge
{
    int ed;
    struct edge *next;
}*p[100002];
void add(int x,int y)
{
    edge *q=new edge;
    q->ed=y;
    q->next=p[x];
    p[x]=q;
}
int ans,idx;
stack<int>Q;
void Tarjan(int x)
{
  int v;
  dfs[x]=low[x]=idx++;
  Q.push(x);
  ins[x]=1;
  for( edge *j=p[x];j;j=j->next)
  {
      if(dfs[j->ed]==-1)
      {
          Tarjan(j->ed);
          low[x]=low[x]>low[j->ed]?low[j->ed]:low[x];
      }
      else if(ins[j->ed]==1)
          low[x]=low[x]>dfs[j->ed]?dfs[j->ed]:low[x];
  }   
  if(low[x]==dfs[x])
  {
     
      while(1)
      {
          v=Q.top();
          Q.pop();
          ins[v]=0;
          if(v==x)break;
      } ans++;
  }
}
int main()
{
    int i,x,y;
    while(scanf("%d%d",&n,&m),m||n)
    {
        for(i=0;i<=n;i++)
        {
            p[i]=NULL;
            dfs[i]=-1;
            ins[i]=0;
        }
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            add(x,y);
        }
        if(n<=1)    {printf("Yes\n");continue;}  
        if(m==0)    {printf("No\n");continue;}  
        ans=0;idx=0;
         for(i=1;i<=n;i++)
             if(dfs[i]==-1)
                 Tarjan(i);
        if(ans==1)
        printf("Yes\n");
        else printf("No\n");

    }
    return 0;
}


你可能感兴趣的:(编程,算法,百度,ACM,Tarjan)