此题用到了Tarjan算法 详见:http://www.cppblog.com/sosi/archive/2010/09/26/127797.aspx
<pre name="code" class="cpp">#include <iostream>
#include <cstdio>
#include <vector>
#include<stack>
using namespace std;
#define maxn 20005
int n,m;
struct Node{
int dnf;
int visit;
int low;
int instack;
int root;
void init()
{
dnf=-1;
visit=0;
low=-1;
instack=0;
root=-1;
}
};
int num,circle;
stack<int>s;
vector<int>mapp[maxn];
Node stu[maxn];
void Tarjan(int sum)
{
s.push(sum);
stu[sum].dnf=num++;
stu[sum].visit=1;
stu[sum].instack=1;
stu[sum].low=stu[sum].dnf;
for(int i=0;i<mapp[sum].size();i++)
{
if(!stu[mapp[sum][i]].visit)
{
Tarjan(mapp[sum][i]);
stu[sum].low=min(stu[sum].low,stu[mapp[sum][i]].low);
}
else if(stu[mapp[sum][i]].instack)
{
stu[sum].low=min(stu[sum].low,stu[mapp[sum][i]].dnf);
}
}
if(stu[sum].low==stu[sum].dnf)
{
int r;
do
{
r=s.top();
stu[r].root=circle;
s.pop();
stu[r].instack=0;
}while(r!=sum);
circle++;
}
}
int main()
{
int i,j,n1,n2;
while(~scanf("%d%d",&n,&m)&&(n||m))
{
for(i=0;i<maxn;i++)
{
mapp[i].clear();
stu[i].init();
}
while(s.size())
{
s.pop();
}
num=1;
circle=0;
for(i=1;i<=m;i++)
{
scanf("%d%d",&n1,&n2);
mapp[n1].push_back(n2);
}
for(i=1;i<=n;i++)
{
if(!stu[i].visit)Tarjan(i);
}
if(circle==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}