SCC之tarjan算法入门【HDU 1269】

来源:互联网 发布:知乎回答能删除吗 编辑:程序博客网 时间:2024/06/06 12:31

转载请注明出处:http://blog.csdn.net/a1dark

分析:题意很简单、就是问图的SCC是否为1、于是学习tarjan算法、判断图中SCC数量、

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=10001;struct node{    int e,next;}mpt[maxn*10];int head[maxn];int n,m,k;int low[maxn];int dfn[maxn];int vis[maxn];int que[maxn];int cnt,index,top;void add(int s,int t){    mpt[k].e=t;    mpt[k].next=head[s];    head[s]=k++;}void tarjan(int s){    low[s]=dfn[s]=++index;    que[++top]=s;    vis[s]=1;    for(int i=head[s];i!=-1;i=mpt[i].next){        int e=mpt[i].e;        if(!dfn[e]){            tarjan(e);            low[s]=min(low[s],low[e]);        }        else if(vis[e]){            low[s]=min(low[s],dfn[e]);        }    }    if(low[s]==dfn[s]){        cnt++;        int e;        do{            e=que[top--];            vis[e]=0;        }while(s!=e);    }}void init(){    memset(head,-1,sizeof(head));    memset(dfn,0,sizeof(dfn));    memset(vis,0,sizeof(vis));    cnt=k=index=0;    top=-1;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF){        if(n==0&&m==0)break;        init();        int a,b;        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(cnt==1)printf("Yes\n");        else printf("No\n");    }    return 0;}


原创粉丝点击