hdu 1269 (强连通基础图)

来源:互联网 发布:mac excel 公式求值 编辑:程序博客网 时间:2024/05/22 13:34

//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;}