C++ 拓扑排序算法

缺乏、安全感 2022-06-10 11:50 322阅读 0赞

拓扑排序

有向无环图

如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图。

拓扑排序

拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,如果存在边u->v,那么在序列中u一定在v前面,这个序列又被称为拓扑序列。

如下图:结点0和1没有前驱节点,可以任意访问,但是结点2必须在结点0和1访问完之后才能访问,同理结点3和4必须在结点2访问完以后才能访问,但是结点3和4 之间没有依赖关系,结点5必须在结点3和结点6访问之后才能访问,等等…..

因此,对于下图的一个拓扑序列可以是:0,1,2,3,4,6,5,7 也可以是:0,1,2,4,6,3,5,7

![Image 1][]

拓扑排序步骤如下:

(1)定义一个队列Q,并把所有入度为0的结点加入队列

(2)取队首结点,访问输出,然后删除所有从它出发的边,并令这些边到达的顶点的入度减1,如果某个顶点的入度减为0,则将其加入队列。

(3)重复进行(2)操作,直到队列为空。如果队列为空时入过队的结点数恰好为N,说明拓扑排序成功,图G为有向无环图;否则,拓扑排序失败,图G有环。

Center

代码实现如下:

  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5. bool TopSort(vector<vector<int>> &G, int n, vector<int> &inDegree) {
  6. /*
  7. * param
  8. * G: 邻接表
  9. * n: 顶点数
  10. * InDegree: 记录顶点的入度
  11. */
  12. int num = 0; //记录加入拓扑排序的顶点数
  13. queue<int> q;
  14. for (int i = 0; i < n; i++)
  15. if (inDegree[i] == 0)
  16. q.push(i); //将所有入度为0的顶点入队
  17. while (!q.empty()) {
  18. int u = q.front(); //取队首顶点u
  19. cout << u << " ";
  20. q.pop();
  21. for (int i = 0; i < G[u].size(); i++) {
  22. int v = G[u][i]; //u的后继节点
  23. inDegree[v]--; //v的入度减1
  24. if (inDegree[v] == 0) //顶点v的入度减为0则入队
  25. q.push(v);
  26. }
  27. G[u].clear(); //清空顶点u的所有出边
  28. num++;
  29. }
  30. if (num == n) //加入拓扑序列的顶点数为n,说明拓扑排序成功,否则,失败
  31. return true;
  32. else
  33. return false;
  34. }
  35. int main() {
  36. int n, m;
  37. cout << "请输入顶点数和边数:";
  38. cin >> n >> m;
  39. vector<vector<int>> G(n);
  40. for (int i = 0; i < m; i++) {
  41. int x, y;
  42. cout << "请输入第" << i+1 << "条边的顶点:";
  43. cin >> x >> y;
  44. G[x].push_back(y);
  45. }
  46. cout << "拓扑排序为:";
  47. vector<int> inDegree(n);
  48. for (auto x : G) {
  49. for (auto y : x)
  50. inDegree[y]++;
  51. }
  52. bool res = TopSort(G, n, inDegree);
  53. return 0;
  54. }

运行结果为:

Center 1

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,322人围观)

还没有评论,来说两句吧...

相关阅读

    相关 拓扑排序C语言)

    在一个有向无环图中,用顶点表示活动,用弧表示活动间的优先关系的有向无环图,称为顶点表示活动的网,简称AOV-网。 对AOV-网,可用拓扑排序来得到他们顶点数据的优先关系,即拓

    相关 拓扑排序算法

    拓扑排序算法 一个复杂的工程通常可以分解成一组小任务的集合,完成这些小任务意味着整个工程的完成。例如,汽车装配工程可分解为以下任务:将底盘放上装配线,装轴,将座位装在底盘上,

    相关 C++ 拓扑排序算法

    拓扑排序 有向无环图 如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图。 拓扑排序 拓扑排序是将有向无环图G的

    相关 经典算法拓扑排序

    定义: 把AOV网(用定点表示活动,用弧表示活动间优先关系的有向图)络中各个顶点按照它们互相之间的优先关系排列成一个线性序列的过程叫做拓扑排序。 方法: 1.