#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
#define PF(x) (scanf("%d",&x))
#define PT(x,y) (scanf("%d%d",&x,&y))
#define PR(x) (printf("%d\n",x))
#define PRT(x,y)(printf("%d %d\n",x,y))
#define PB(x)(scanf("%I64d",&x))
#define PRB(x)(printf("%I64d\n",(x)))
#define N 10005
#define M 10000
#define Mod 1000
int n,m,k;
vector<int> G[N];
vector<int> Gb[N];
int vis[N];
int finish[N];
int t;
void reinit()
{
for(int i=0;i<=n;i++)
if(!G[i].empty()) G[i].clear();
for(int i=0;i<=n;i++)
if(!Gb[i].empty()) Gb[i].clear();
memset(vis,0,sizeof(vis));
t = 0;
memset(finish,0,sizeof(finish));
}
void dfs(int v)
{
t ++;
for(int i=0;i<(int)G[v].size();i++)
{
if(!vis[G[v][i]])
{
vis[G[v][i]] = 1;
dfs(G[v][i]);
}
}
finish[v]= t++;
}
void redfs(int v)
{
for(int i=0;i<(int)Gb[v].size();i++)
if(!vis[Gb[v][i]])
{
vis[Gb[v][i]] = 1;
redfs(Gb[v][i]);
}
}
void init()
{
while(scanf("%d%d",&n,&m)!=EOF &&(m+n!=0))
{
//if(n==0 && m == 0) break;
reinit();
for(int i=0;i<m;i++)
{
int x,y;
PT(x,y);
G[x].push_back(y);
Gb[y].push_back(x);
}
bool flag = false;
if(n==1) {puts("Yes");continue;}
for(int i=1;i<=n;i++)
if(!vis[i])
{
vis[i]=1;
dfs(i);
}
/*for(int i=1;i<=n;i++)
if(!vis[i]){flag = true;break;}
if(flag) {puts("no");continue;}*/
int maxx = -1;int index = -1;
for(int i=1;i<=n;i++)
if(finish[i]>maxx) {maxx = finish[i];index = i;}
memset(vis,0,sizeof(vis));
vis[index]=1;
redfs(index);
for(int i=1;i<=n;i++)
if(!vis[i]){flag = true;break;}
if(flag) puts("No");
else puts("Yes");
}
return ;
}
int main()
{
init();
return 0;
}
hdu 1269
最新推荐文章于 2021-04-20 15:33:14 发布