HUD-3342 Legal or Not 拓扑排序 kahn算法(基于入度) 的有向图判环

实现:1,没有前驱的结点输出  2 从图中删除该顶点和所有出边  重复1,2直至所有顶点都输出。或不存在无前驱的顶点,后者代表有向图是有环的。(有向图判环)

#include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=110;
vector<int>grid[maxn];
int indu[maxn];
bool find(int N){
	int sum=0;
	queue<int>Q;
	for(int i=0;i<N;i++)if(indu[i]==0)Q.push(i);
	while(!Q.empty()){
		int now=Q.front();Q.pop();
		sum++;
		for(int i=0;i<grid[now].size();i++){
			int next=grid[now][i];
			if(--indu[next]==0)Q.push(next);
		}
	}
	if(sum==N)return true;
	else return false;
}
int main(){
	int N,M;
	while(scanf("%d%d",&N,&M)==2 &&N){
		for(int i=0;i<N;i++)grid[i].clear();
		memset(indu,0,sizeof(indu));
		while(M--){
			int u,v;
			scanf("%d%d",&u,&v);
			grid[u].push_back(v);
			indu[v]++;
		}
		if(find(N))printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/80634352
今日推荐