拓扑排序
通常用来判断途中图中有没有环
模板
#include<iostream> #include<string.h> using namespace std; #define MAXN 105 int G[MAXN][MAXN]; int in[MAXN]; int ans[MAXN]; int n, m; void ac() { for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(G[i][j]==1) { in[j]++;//计算每个点的入度 } } }//计算入度 for(int i = 0; i < n; i++) { int k = 0; while(in[k] != 0) { k++; }//找出入度为0的点 if(k>=n){ cout<<"NO"<<endl; return ; } in[k] = -1;//设置为以修改,以删除状态 for(int j = 0; j < n; j++) { if(G[k][j]==1) { in[j]--;//将以该点出发的别的点的入读全部减1 } } } int f=0; for(int j =0; j < n; j++) { if(in[j]!=-1) {//如果没有度数为0的点,但是还没被访问过,说明矛盾了 f=1; } } if(f==1) cout<<"NO"<<endl; else cout<<"YES"<<endl; } void init() { memset(in,0,sizeof(in)); memset(G,0,sizeof(G)); } int main() { while(cin>>n>>m) { if(n==0)break; init(); for(int i = 0; i < m; i++) { int x,y; cin>>x>>y; G[x][y] = 1; } ac(); } return 0; }