题意:问拓扑排序是否能成功排序。
思路:dfs。使用两种节点标记,1表示开始进行排序,2表示已经排序完成。如果搜到了标记为1的点,说明失败。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>
using namespace std;
vector<int> E[105];
int vis[105];
bool dfs(int x){
int sz=E[x].size();
vis[x]=1;
for(int i=0;i<sz;i++){
int v=E[x][i];
if(vis[v]==2)continue;
if(vis[v]==1)return 0;
if(!dfs(v)){
return 0;
}
}
vis[x]=2;
return 1;
}
int main(){
int n,m;
while(cin>>n>>m){
memset(E,0,sizeof(E));
memset(vis,0,sizeof(vis));
int a,b;
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
E[a].push_back(b);
}
bool ok=1;
for(int i=1;i<=n;i++){
if(!vis[i]){
bool t=dfs(i);
if(!t){
ok=0;
break;
}
}
}
if(ok){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}