拓扑排序
拓扑排序
通常用来判断途中图中有没有环
模板
#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;
}