强连通分量模板

来源:互联网 发布:php流媒体服务器 编辑:程序博客网 时间:2024/05/29 17:41
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;#define ll long long#define me(a,b) memset(a,b,sizeof(a))struct node{    int u,next;}e[100005];int top,tot,cnt,sum,head[100005],dfn[10005],low[10005],book[10005],stack[10005],belong[10005];void add(int u,int v){    e[top].u=v;    e[top].next=head[u];    head[u]=top++;}void tarjan(int x){    dfn[x]=low[x]=++tot;    stack[cnt++]=x;    book[x]=1;    for(int i=head[x];i!=-1;i=e[i].next)    {        int u=e[i].u;        if(!dfn[u])        {            tarjan(u);            low[x]=min(low[x],low[u]);        }        else if(book[u])        {            low[x]=min(low[x],dfn[u]);        }    }int t;    if(low[x]==dfn[x])        {            sum++;            do{             t=stack[--cnt];                book[t]=0;                belong[t]=sum;            }while(t!=x);        }}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)&&(n+m))    {        int a,b;        me(head,-1); me(dfn,0);        top=tot=cnt=sum=0;        for(int i=0;i<m;i++)        {            scanf("%d%d",&a,&b);            add(a,b);        }        for(int i=1;i<=n;i++)        {            if(!dfn[i]) tarjan(i);        }        if(sum==1)            printf("Yes\n");        else printf("No\n");    }}


原创粉丝点击