代码:
#include<iostream>
#include<stack>
#include<vector>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
vector<int>v[10005];
stack<int>S;
int low[10005],pre[10005],num,ans[10005],k;
int dfs(int x)
{
S.push(x);
low[x]=pre[x]=++num;
for(int i=0;i<v[x].size();i++)
{
if(!pre[v[x][i]])
{
dfs(v[x][i]);
low[x]=min(low[x],low[v[x][i]]);
}
else if(!ans[v[x][i]])
low[x]=min(low[x],pre[v[x][i]]);
}
if(low[x]==pre[x])
{ k++;
while(1)
{
int z=S.top();S.pop();
ans[z]=k;
if(z==x) break;
}
}
return 1;
}
int main()
{
int N,M,i,j,x,a,b;
while(~scanf("%d%d",&N,&M))
{
memset(low,0,sizeof(low));
memset(pre,0,sizeof(pre));
memset(ans,0,sizeof(ans));
k=0;
if(N==0&&M==0) break;
for(int i=1;i<=N;i++) v[i].clear();
for(i=1;i<=M;i++) {
scanf("%d%d",&a,&b);
v[a].push_back(b);
}
for(i=1;i<=N;i++){if(!pre[i]) dfs(i); }///缩点
int in[10005],out[10005];
a=b=0;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
for(i=1;i<=N;i++)
for(j=0;j<v[i].size();j++)
{
if(ans[i]!=ans[v[i][j]])///ans[i]是缩点后i对应的新点
in[ans[v[i][j]]]=out[ans[i]]=1;
}
if(k==1) printf("Yes\n");///k是新点的个数
else
{
printf("No\n");
}
}
}