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;
}