学习来源:
代码随香炉:https://www.programmercarl.com/
labuladong算法:https://labuladong.github.io/algo/
图
连接直接看:
图论算法 及 相关的题目
遍历所有路径
拓扑排序
课程表1 判断是否有环
DFS版本
课程表2 拓扑排序
DFS版本
其实特别简单,将后序遍历的结果进行反转,就是拓扑排序的结果。
class Solution {
public:
vector<vector<int>> g;
vector<int> vis;
vector<int> onpath;
bool isCircle = false;
public:
void build(vector<vector<int>>& a){
for(const vector<int>& item : a){
g[item[1]].push_back(item[0]);
}
}
void tranverse(vector<vector<int>>& a,int s){
if(onpath[s]) isCircle = true;
if(onpath[s] || vis[s]) return;
vis[s] = 1;
onpath[s] = 1;
for(int num : g[s]){
tranverse(a,num);
}
onpath[s] = 0;
}
bool canFinish(int n, vector<vector<int>>& a) {
onpath.resize(n);
vis.resize(n);
g.resize(n);
build(a);
for(int i = 0; i < n; i++){
tranverse(a,i);
}
return !isCircle;
}
};