博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拓扑排序
阅读量:5244 次
发布时间:2019-06-14

本文共 1340 字,大约阅读时间需要 4 分钟。

1. 拓扑排序的先决条件:
         图必须是一个无环有向图。序列必须满足的条件:
    (1)每个顶点出现且只出现一次。
    (2)若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
 
2.拓扑排序的思想(源删除算法):
   (1)选择一个没有输入边(入度为0)的源顶点(若有多个则任选一个),将它和它的输出边删除。
   (2)重复源顶点的删除操作,直到不存在入度为0的源顶点为止。
   (3)最终,检测图中的顶点个数,若还有顶点存在则算法无解,否则顶点的删除顺序就是拓扑排序的输出顺序。
              
 (ps:算法无解表示整个图不是无环图)
                                                       
3.拓扑排序的复杂度:
       由于删除顶点的同时还要删除它的输出边,所以拓扑排序的时间复杂度是: O(V+E)
 
4.拓扑排序的C++程序:
#include 
#include
#include
#include
using namespace std;class Graph{public: Graph(int v); ~Graph(); bool TopoSort(vector
&sort_list); void AddEdge(int v, int w);private: int VertexNum; //顶点个数 list
*Adjlist; //图的邻接链表 queue
NonInputVertex; //入度为0的顶点 vector
VertexInputNum; //每个顶点的入度个数};Graph::Graph(int v){ this->VertexNum = v; this->Adjlist = new list
[v]; this->VertexInputNum.resize(v);}Graph::~Graph(){ delete [] Adjlist;}void Graph::AddEdge(int v, int w){ this->Adjlist[v].push_back(w); VertexInputNum[w]++; // w的入度值增加}bool Graph::TopoSort(vector
&sort_list){ for(int i=0; i

 

转载于:https://www.cnblogs.com/ladawn/p/8449374.html

你可能感兴趣的文章
Factory Design Pattern
查看>>
python中贪婪与非贪婪
查看>>
guava API整理
查看>>
无锁编程笔记
查看>>
jquery mobile
查看>>
如何在vue单页应用中使用百度地图
查看>>
Springboot使用步骤
查看>>
Spring属性注入
查看>>
Springboot-配置文件
查看>>
Springboot-日志框架
查看>>
P1192-台阶问题
查看>>
一、使用pip安装Python包
查看>>
spring与quartz整合
查看>>
Kattis之旅——Eight Queens
查看>>
3.PHP 教程_PHP 语法
查看>>
Duilib扩展《01》— 双击、右键消息扩展
查看>>
利用Fiddler拦截接口请求并篡改数据
查看>>
python习题:unittest参数化-数据从文件或excel中读取
查看>>
在工程中要加入新的错误弹出方法
查看>>
PS 滤镜— — sparkle 效果
查看>>