hdu 1269 迷宫城堡 判断强连通分量数目 tarjan算法

来源:互联网 发布:ip开放端口查询 编辑:程序博客网 时间:2024/06/06 12:54

原题链接:点击打开链接

思路:有向图的强连通,判断强连通分量是否为一;

这是我学习tarjan算法的博客:点击打开链接

code:

#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<vector>#include<stack>#include<math.h>using namespace std;vector<int >vec[10005];stack<int>sta;int dfn[10005],low[10005],vis[10005];int n,m,sum,nn;void tarjan(int s){    dfn[s]=low[s]=(++nn);    vis[s]=2;    sta.push(s);    for(int i=0;i<vec[s].size();i++)    {        int t=vec[s][i];        if(!dfn[t])        {            tarjan(t);            low[s]=min(low[s],low[t]);        }        else        {            if(vis[t]==2)                low[s]=min(low[s],dfn[t]);        }    }    if(dfn[s]==low[s])    {            sum++;            while(!sta.empty())            {                int tem=sta.top();                sta.pop();                vis[tem]=1;                if(tem==s)                    break;            }    }}int main(){    //freopen("i.txt","r",stdin);    int i,j,a,b;    while(scanf("%d%d",&n,&m)!=EOF )    {        if(n==0 && m==0)            break;        memset(dfn,0,sizeof(dfn));        memset(vis,0,sizeof(vis));        memset(low,0,sizeof(low));        for(i=1;i<=n;i++)            vec[i].clear();        while(sta.empty()==0)            sta.pop();        for(i=0;i<m;i++)        {            scanf("%d%d",&a,&b);            vec[a].push_back(b);        }        sum=nn=0;        for(i=1;i<=n;i++)            if(!dfn[i])                tarjan(i);        if(sum>1)            puts("No");        else            puts("Yes");    }    return 0;}


0 0