HDU 1269 迷宫城堡 (有向图的强连通分量)

来源:互联网 发布:全民奇迹翅膀进阶数据 编辑:程序博客网 时间:2024/05/18 00:02

判断是否为强连通图,跑一遍模板,强连通分量的个数为1,即为强连通图


#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <queue>#include <cstring>using namespace std;const int MAXN = 10010;  //点数const int MAXM = 100100;  //边数struct edge{    int to,next;} edge[MAXM];int head[MAXN],tot;int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];int index,top;int scc;//强连通分量的个数bool instack[MAXN];int num[MAXN]; //各个强连通分量包含点的个数void addedge(int u,int v){    edge[tot].to=v;    edge[tot].next=head[u];    head[u]=tot++;}void Tarjan(int u){    int v;    Low[u]=DFN[u]=++index;       Stack[top++]=u;    instack[u]=true;    for(int i=head[u]; ~i; i=edge[i].next)    {        v=edge[i].to;        if(!DFN[v])        {            Tarjan(v);            if(Low[u]>Low[v])                Low[u]=Low[v];        }        else if(instack[v]&&Low[u]>DFN[v])            Low[u]=DFN[v];    }    if(Low[u]==DFN[u])    {        scc++;        do        {            v=Stack[--top];            instack[v]=false;            Belong[v]=scc;            num[scc]++;        }        while(v!=u);    }}void solve(int n){    memset(DFN,0,sizeof(DFN));    memset(instack,0,sizeof(instack));    memset(num,0,sizeof(num));    index=scc=top=0;    for(int i=1; i<=n; ++i)    {        if(!DFN[i])            Tarjan(i);    }}void init(){    tot=0;    memset(head,-1,sizeof(head));}int main(){    int n,m;    while(cin>>n>>m && n+m!=0)    {        init();        int a,b;        for(int i=0; i<m; ++i)        {            cin>>a>>b;            addedge(a,b);        }        solve(n);        if(scc==1)        {            puts("Yes");        }        else            puts("No");    }    return 0;}


0 0
原创粉丝点击