hdu 1269

强连通分量  基础题  比较简单 第一次使用链式结构 纪念一下

#include<iostream>
using namespace std;
struct G
{
    int dest;
    G *next;
};
int n,m;
G *ga[10001];
G *gt[10001];
int path[10001];
int vis[10001];
void addedge(G *g[],int i,int j)
{
    G *l=new G;
    l->dest=j;
    l->next=g[i];//注意g初始化为0
    g[i]=l;
}
void dfsa(int u)
{
    G *l=ga[u];
    if(!vis[u])
    {
        vis[u]=1;
        for(l;l!=NULL;l=l->next)
            dfsa(l->dest);
        path[0]++;
        path[path[0]]=u;
    }
}
void dfst(int u)
{
    G *l=gt[u];
    if(!vis[u])
    {
        vis[u]=1;
        for(l;l!=NULL;l=l->next)
            dfst(l->dest);
    }
}
void k()
{
    int i;
    path[0]=0;
    memset(vis,0,sizeof(vis));
    //搜索原图
    for(i=1;i<=n;i++)
    {
        if(!vis[i])
            dfsa(i);
    }
    memset(vis,0,sizeof(vis));
    int sum=0;
    for(i=n;i>=1;i--)
    {
        if(!vis[path[i]])
        {
            sum++;
            dfst(path[i]);
        }
    }
    if(sum>1)
        printf("No\n");
    else
        printf("Yes\n");
}
int main()
{
    int a,b;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0&&m==0)
            break;
        for(int i=1;i<=n;i++)
            ga[i]=gt[i]=NULL;
        while(m--)
        {
            scanf("%d%d",&a,&b);
            addedge(ga,a,b);
            addedge(gt,b,a);
        }
        k();
    }
    return 0;
}



posted @ 2014-04-18 18:58  _一千零一夜  阅读(123)  评论(0编辑  收藏  举报