- 拓扑排序:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。
下图是一个拓扑排序:
下图不是一个拓扑排序:
- 如何获得一个图的拓扑排序:找到图中所有入度为0的点,放入序列,删除这些点和以这些点为出度的边,再找所有入度为0的点,依次循环。
- 如何通过拓扑排序判断图中是否有环:拓扑排序之后,若还剩有点,则表示有环。
- leetcode代码:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<set<int>> matrix(numCourses); for(int i=0; i<prerequisites.size(); i++) matrix[prerequisites[i].second].insert(prerequisites[i].first); vector<int> degree(numCourses, 0); for(int i=0; i<numCourses; i++) for(auto it:matrix[i]) ++degree[it]; for(int i=0; i<numCourses; i++) { int j; for(j=0; j<numCourses && degree[j]!=0; ++j); if(j==numCourses) return false; degree[j] = -1; for(auto it:matrix[j]) --degree[it]; } return true; }
判断有向图是否有环之拓扑排序-LeetCode 207. Course Schedule
最新推荐文章于 2024-02-20 10:45:28 发布