模版。。。不解释。/。。。
http://acm.hdu.edu.cn/showproblem.php?pid=1269
#include<stdio.h>
#include<iostream>
#include<string.h>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define M 100005
#define N 10005
using namespace std;
struct s
{
int num,next;
}st[M];
int he[N],r[N],dq[N],ab[N],num=0,m,cs=0,dnf[N],ans,istack[N],stack[N],belong[N],top;
void init()
{
CLR(he,-1);
CLR(r,0);
CLR(dq,0);
CLR(dnf,0);
CLR(stack,0);
CLR(istack,0);
CLR(belong,0);
num=0;
cs=0;
num=0;
top=0;
ans=0;
}
void add(int a,int b)
{
st[num].num=b;
st[num].next=he[a];
he[a]=num++;
}
void dfs(int x)
{
r[x]=dnf[x]=++cs;
istack[x]=1;
stack[top++]=x;
int i;
for(i=he[x];i!=-1;i=st[i].next)
{
int v=st[i].num;
if(!dnf[v])
{
dfs(v);
r[x]=min(r[x],r[v]);
}
else if(stack[v])
{
r[x]=min(dnf[v],r[x]);
}
}
int u;
if(r[x]==dnf[x])
{
ans++;
do
{
u=stack[top--];
istack[u]=0;
belong[u]=ans;
}while(u!=x);
}
}
int main()
{
int n;
while(~scanf("%d%d",&m,&n)&&(m+n))
{
init();
int i,a,b;
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
}
for(i=1;i<=m;i++)
if(!dnf[i])
dfs(i);
if(ans==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}