拓扑排序是面试考试中的高频考点,尤其需要重视;
此外 ,一个重要结论:一个图存在拓扑序 等价于 该图为有向无环图
【问题描述】
给出一个有向图,判断图中是否存在回路。
【输入形式】
首先输入整数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;
}
}
拓扑排序的经典应用!!!要记住!