数据结构与算法——有向无环图的拓扑排序C++实现

拓扑排序简介:

拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从Vi到Vj的路径,那么在排序中Vi在Vj的前面。
如果图中含有回路,那么拓扑排序是不可能的。 此外,拓扑排序不必是唯一的,任何合理的排序都可以。


对于上面的无环图:v1,v2,v5,v4,v3,v7,v6和v1,v2,v5,v4,v7,v3,v6都是合理的拓扑排序。

一个简单的求拓扑排序的思路:

1、先找出任意一个没有入边的顶点
2、然后显出该点,并将它和它邻接的所有的边全部删除。
3、然后,对图中其它部分做同样的处理。

图用邻接表表示法来存储:





左边的数组此时就有用了,用来保存每个顶点的信息,该数组中每个元素的数据结构为:
//保存每个顶点信息的数据结构
struct GraphNode{
    int vertex;//当前顶点的标号
    int inDegree;//当前顶点的入度
    int topNum;//当前顶点的拓扑排序的顺序标号
};

图的邻接表示法的类的接口:

/*******************************************************
*  类名称: 邻接表图
********************************************************/ 
class Graph{
    private:
        int edge_num;//图边的个数
        int vertex_num;//图的顶点数目
        list<Node> * graph_list;//邻接表
        vector<GraphNode> nodeArr;//保存每个顶点信息的数组
        
    public:
        Graph(){}
        Graph(char* graph[], int edgenum); 
        ~Graph();
        void print();
        vector<int> topoSort();//拓扑排序
    private:
  
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值