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;
	
	}
}

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

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...