hdu1269 迷宫城堡(强连通图)

来源:互联网 发布:linux 重启oracle 编辑:程序博客网 时间:2024/04/30 16:19

这里写图片描述
强连通模版题~

tarjan算法,通过计算强连通分量的个数来判断此图是否为强连通图

#include <stdio.h>#include <vector>#include <string.h>#include <stack>#include <algorithm>using namespace std;#define N 10005vector<int>link[N];//邻接表建图 stack<int>s;int dfn[N],low[N]; bool isStack[N];int n,m;int t=0,edge,num,topStack;void tarjan(int root){    dfn[root]=low[root]=++t;//时间戳     s.push(root);    isStack[root]=true;    //遍历顶点root指向的每一条边     for(int i=0;i<link[root].size();i++)    {        edge=link[root][i];        //如果这条边未遍历过         if(!dfn[edge])        {            tarjan(edge);            low[root]=min(low[edge],low[root]);        }        //如果这条边已经遍历过 并且在栈里          else if(isStack[edge])        {            low[root]=min(low[root],dfn[edge]);        }    }    //如果顶点root是强连通分量的根     if(dfn[root]==low[root])    {        //强连通分量个数+1 并将该强连通分量出栈         num++;          do        {            topStack=s.top();s.pop();            isStack[topStack]=false;        }while(topStack!=root);    }}void doTarjan(){    for(int i=1;i<=n;i++)    {        if(!dfn[i]) tarjan(i);    }}int main(){//  freopen("in.txt","r",stdin);    while(~scanf("%d %d",&n,&m))    {        memset(dfn,0,sizeof(dfn));        memset(low,0,sizeof(low));        memset(link,0,sizeof(link));        memset(isStack,false,sizeof(isStack));        if(n==0&&m==0) break;        num=0;        int a,b;        for(int i=0;i<m;i++)        {            scanf("%d %d",&a,&b);            link[a].push_back(b);        }        doTarjan();        //如果强连通分量只有一个  证明全图此图是个强连通图         if(num==1) puts("Yes");        else puts("No");    }    return 0;} 
1 0
原创粉丝点击