学习了一下tarjan。
#include <iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
#define MAXN 10005
#define MAXM 200005
struct node
{
int to,next;
}edge[MAXM];
int head[MAXN],en;
int low[MAXN],dfn[MAXN],stack[MAXN],top,set[MAXN],col,num;
bool vis[MAXN],instack[MAXN];
int n;
int m;
void addedge(int a,int b)
{
edge[en].to=b;
edge[en].next=head[a];
head[a]=en++;
}
void tarjan(int u)
{
vis[u]=1;
dfn[u]=low[u]=++num;
instack[u]=true;
stack[++top]=u;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(!vis[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else
if(instack[v])
low[u]=min(dfn[v],low[u]);
}
if(dfn[u]==low[u])
{
int j;
col++;
do
{
j=stack[top--];
instack[j]=false;
// set[j]=col;
}
while (j!=u);
}
}
void init()
{
int i;
top=col=num=0;
memset(head,-1,sizeof(head));
memset(instack,0,sizeof(instack));
memset(vis,0,sizeof(vis));
//memset(set,-1,sizeof(set));
}
int main()
{
int a,b;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m) break;
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
addedge(a,b);
}
for(int i=1;i<=n;i++)
if(!vis[i])tarjan(i);
printf("%s\n",col==1?"Yes":"No");
}
return 0;
}