hdu 1269 tarjan算法模板

来源:互联网 发布:mac pro2016充电器 编辑:程序博客网 时间:2024/05/21 05:22
#include<iostream>#include<stack>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=110000;struct node{    int v,next;}edge[maxn*3];int cnt=0,n,m,ans,top,dep=0;int low[maxn],dfn[maxn],head[maxn];int vis[maxn],instack[maxn],ss[maxn];void add_edge(int u,int v){    edge[cnt].v=v;    edge[cnt].next=head[u];    head[u]=cnt++;}void dfs(int u){    dfn[u]=low[u]=++dep;    vis[u]=1;    ss[++top]=u;    instack[u]=1;    int i;    for(i=head[u];i!=-1;i=edge[i].next)    {        int to=edge[i].v;        if(!vis[to])        {            dfs(to);            low[u]=min(low[u],low[to]);        }        else if(instack[to])        {            low[u]=min(low[u],dfn[to]);        }    }    if(low[u]==dfn[u])    {           int k;        ans++;        do        {   k=ss[top];            top--;            instack[k]=0;        }while(k!=u);       }}void judge(){    int i;    ans=0;    top=-1;    for(i=1;i<=n;i++)    {        if(!vis[i])        {            dfs(i,1);        }    }}int main (){    while(~scanf("%d%d",&n,&m))    {        if(n==0&&m==0)            break;        ans=0,cnt=0;        dep=0;        memset(vis,0,sizeof(vis));        memset(head,-1,sizeof(head));        memset(low,0,sizeof(low));        memset(dfn,0,sizeof(dfn));        memset(instack,0,sizeof(instack));        int i;        for(i=1;i<=m;i++)        {            int xx,yy;            scanf("%d%d",&xx,&yy);            add_edge(xx,yy);        }        judge();        if(ans>1)            printf("No\n");        else            printf("Yes\n");    }}