找个板子扔这里,慢慢学习
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
using namespace std;
#define maxn 10005
#define MOD 1000000007
#define mem(a) memset(a , 0 , sizeof(a))
#define LL __int64
vector<int>V[10001];
int Bcnt; /// 强连通分量的个数;
int Top; /// 栈顶;
int Index; /// 时间戳;
int low[maxn], dfn[maxn];
int belong[maxn], stac[maxn];
bool instack[maxn];
int n , m;
void init()
{
Bcnt= Top= Index= 0;
for(int i=1; i<=n; ++i) low[i]= dfn[i]= 0;
}
void Tarjan(int u)
{
stac[Top++] = u;
instack[u] = 1;
low[u] = dfn[u] = ++Index;
for(int i = 0; i < V[u].size(); ++i)
{
int v= V[u][i];
if( !dfn[v] )
{
Tarjan(v);
low[u]= min( low[v], low[u] );
}
else if( instack[v] )
low[u]= min( low[u], dfn[v] );
}
if( low[u] == dfn[u] )
{
++Bcnt;
int v;
do
{
v = stac[--Top];
instack[v] = 0;
belong[v] = Bcnt;
}
while( u != v );
}
}
int main()
{
while(scanf("%d %d" , &n , &m) != EOF && (n || m))
{
for(int i = 0 ; i <= n ; i ++) V[i].clear();
int u , v;
for(int i = 0 ; i < m ; i ++)
{
scanf("%d %d" , &u , &v);
V[u].push_back(v);
}
init();
for(int i=1; i<=n; ++i)
{
if( !dfn[i] )
Tarjan(1);
}
if(Bcnt == 1) printf("Yes\n");
else printf("No\n");
}
return 0;
}