#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
using namespace std;
#define MAXD 100
int G[MAXD][MAXD];
int d[MAXD];
int n,m;
bool Judge_Topp(){
stack<int>S;
for(int i = 0 ;i < n; i++){
if(d[i] == 0)
S.push(i);
}
while(!S.empty()){
int top = S.top();
S.pop();
for(int i = 0;i <n;i++)
if(G[top][i] == 1){
d[i]--;
if(d[i] == 0)
S.push(i);
}
}
for(int i = 0;i <n;i++)
if(d[i] != 0)
return false;
return true;
}
int main(){
while(scanf("%d%d",&n,&m) != EOF){
memset(d,0,sizeof(d));
for(int i = 0;i < m;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x][y] = 1;
d[y] ++;
}
if(Judge_Topp())
cout<<"YES\n"<<endl;
else
cout<<"No\n"<<endl;
}
return 0;
}
判断拓扑排序
最新推荐文章于 2022-04-20 20:36:00 发布