hdu 1269 迷宫城堡(强连通)

来源:互联网 发布:招商迪辰软件 编辑:程序博客网 时间:2024/06/10 18:43

题意:给定一个有向图,求该图是不是强连通的。

思路:从某点出发,正向和反向两次遍历图,如果都能到达所有点,则该图是强连通的。

强连通:在一个有向图G中,如果任意两点v1、v2存在v1到v2和v2到v1的路径,则称该图是强连通的。

#include<stdio.h>#include<string.h>#define N 10005#define M 100005int path[2][M],next[2][M],head[2][N],vis[2][N];int cnt;void addEdge(int a,int b){    path[0][cnt]=b,next[0][cnt]=head[0][a],head[0][a]=cnt;    path[1][cnt]=a,next[1][cnt]=head[1][b],head[1][b]=cnt++;}int dfs(int key,int index){    vis[key][index]=1;    for(int i=head[key][index];i!=-1;i=next[key][i])    {        int cur=path[key][i];        if(vis[key][cur]) continue;        dfs(key,cur);    }    return 0;}int judge(int n){    for(int i=1;i<=n;i++)    {        if(!vis[0][i]||!vis[1][i])            return 0;    }    return 1;}int main(){    int n,m;    while(scanf("%d%d",&n,&m))    {        if(n==0&m==0) break;        cnt=0;        memset(head,-1,sizeof(head));        memset(next,-1,sizeof(next));        for(int i=1;i<=m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            addEdge(a,b);        }        memset(vis,0,sizeof(vis));        dfs(0,1);        dfs(1,1);        if(judge(n)) printf("Yes\n");        else printf("No\n");    }    return 0;}


0 0
原创粉丝点击