Toposort 拓扑排序的应用 判断图中是否存在回路

拓扑排序是面试考试中的高频考点,尤其需要重视;

此外 ,一个重要结论:一个图存在拓扑序  等价于 该图为有向无环图

相关理论参考另一篇博客—— 图的应用 | 拓扑排序

【问题描述】

给出一个有向图,判断图中是否存在回路。

【输入形式】

首先输入整数m,表示m种测试情况。接下来是每种测试情况的输入数据。

每种测试情况包含几行:

第1行:输入图的顶点个数N(1 ≤ N≤ 2,500)和C(图的边数,1 ≤ C ≤ 6,200);

第2到C+1行中,第i+1行输入两个整数,分别表示第i条边的起点和终点的编号。


【输出形式】

对于每种情况输出一行,如果图中存在回路,输出“YES”,否则,输出“NO”。

【样例输入】

1 7 8 1 2 1 3 2 4 2 6 3 4 4 5 5 2 5 7

【样例输出】

YES

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef struct ListNode {
	int Node;
	ListNode* next;
}*List;

int main() {
	int m; cin >> m;
	while (m--) {
		int N, E; cin >> N >> E;
		vector<List> LGraph(N+1);
		vector<int>num(N+1);
		for (int i = 1; i < N+1; i++) {
			LGraph[i] = nullptr; num[i]=0;
		}
		for (int i = 0; i < E; i++) {
			int v1, v2;
			cin >> v1 >> v2;
			ListNode* node = new ListNode;
			node->Node = v2;num[v2]++;
			node->next = LGraph[v1]; LGraph[v1] = node;
			
		}
		queue<int>zero;
		for (int i = 1; i < N+1; i++)
			if (num[i] == 0)zero.push(i);
		int anc = 0;
		while (!zero.empty()) {
			int top = zero.front(); 
			zero.pop();anc++;
			for (ListNode* tem = LGraph[top]; tem; tem = tem->next)
				if (--num[tem->Node] == 0)zero.push(tem->Node);
		}
		if (N == anc)cout << "NO" << endl;
		else cout << "YES" << endl;
	
	}
}

拓扑排序的经典应用!!!要记住!

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...