拓扑排序
来源:互联网 发布:mac 终端更改时间date 编辑:程序博客网 时间:2024/06/05 20:09
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。一般应用拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务。实现的基本方法拓扑排序方法如下:(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.代码如下:
#include "GraphLink.h"#include <iostream>int A[N][N] = {//C0 C1 C2 C3 C4 C5 C6 C7 C8/*C0*/ 0, 0, 1, 0, 0, 0, 0, 1, 0, /*C1*/ 0, 0, 1, 1, 1, 0, 0, 0, 0, /*C2*/ 0, 0, 0, 1, 0, 0, 0, 0, 0, /*C3*/ 0, 0, 0, 0, 0, 1, 1, 0, 0, /*C4*/ 0, 0, 0, 0, 0, 1, 0, 0, 0, /*C5*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, /*C6*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, /*C7*/ 0, 0, 0, 0, 0, 0, 0, 0, 1, /*C8*/ 0, 0, 0, 0, 0, 0, 1, 0, 0};//***************************************************************//队列实现的图拓扑排序void topSort(Graph &g){for(int i = 0; i < g.verticesNum();i++){g.mark[i] = UNVISITED;//初始化Mark数组}queue<int> que;for(int i = 0; i < g.verticesNum();i++){if(g.indegree[i] == 0)//图中入度为0的顶点入队{que.push(i);}}while(!que.empty()){int v = que.front();que.pop();cout << "C" << v << "\t";g.mark[v] = VISITED;for(Edge edge = g.firstEdge(v); g.isEdge(edge); edge = g.nextEdge(edge))//所有与之相邻的点入度-1{g.indegree[g.toVertex(edge)]--;if(g.indegree[g.toVertex(edge)] == 0){que.push(g.toVertex(edge));//入度为0的顶点入队}}}for(int i = 0; i < g.verticesNum();i++){if(g.mark[i] == UNVISITED){cout << "图中有环" << endl;break;}}}int main(){GraphLink<ListUnit> graphLink(N); // 建立图 graphLink.initGraph(graphLink, A,N); // 初始化图topSort(graphLink);system("pause");return 0;}
0 0
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 第一篇博客
- excel 导入数据库
- 现在我要写一个定时程序定时读取该目录下的所有txt文件到数据库,并把这些txt文件转移到另外一个目录
- C#、VB.NET_关于图片的缩放
- phpMyAdmin部署CentOS出现403错误
- 拓扑排序
- 绘制heatmap
- 电脑重装系统变成一个C盘,其他D,E,F盘数据消失都没有了-艾奇恢复软件
- 不得不说的开源项目
- SRM 551
- Tesseract学习(五)
- 使用 Spring Batch 和 SFTP 安全的发送数据
- 动态库和静态库
- lua 5.2 GC 源码分析 一