拓扑排序

拓扑排序

通常用来判断途中图中有没有环在这里插入图片描述

模板

#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;
}
posted @ 2021-05-24 17:56  cheems~  阅读(23)  评论(0编辑  收藏  举报