拓扑排序 topologicalSort

本文介绍了图的基本概念,包括顶点、边、无向图和有向图,重点讨论了有向图的拓扑排序。拓扑排序是针对有向无环图的一种排序方式,利用广度优先搜索(BFS)策略进行实现。文章通过实例展示了拓扑排序的过程,并探讨了相关问题,如判断是否存在和唯一性,以及如何调整顺序以得到最小或最大顺序的拓扑排序。
摘要由CSDN通过智能技术生成

背景知识 ---- 图 (Graph)

顶点和边 (vertex and edge)

下图中的数字为图的顶点,数字之间的线为图的边
在这里插入图片描述

无向图 (Undirected Graph)

下图中顶点和顶点之间是没有方向性的,可以双向通行。
也就是同时存在 (1, 2) 和 (2, 1)
在这里插入图片描述

有向图 (Directed Graph)

下图是有方向性的,只能往箭头的方向通行
也就是只存在 (1, 2), 不存在 (2, 1)
在这里插入图片描述

有向图的degree

  • 对于有向图,每个顶点都有一个degree,并且分为
  • in-degree: number of edgs into vertex a
  • out-degree: number of edges out of vertex a
  • 下图中
    1: in-degree = 0, out-degree = 1
    2: in-degree = 2, out-degree = 1
    3: in-degree = 0, out-degree = 2
    4: in-degree = 2, out-degree = 0
    在这里插入图片描述

图中的环

图中可以形成回路的是环
下图中 2 —> 4 ----> 3 —> 2,就形成了环在这里插入图片描述

基本概念

什么是拓扑排序

  • 对于一个有向无环图,将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前
  • 如下图: 2 永远不可能在 1和3之前出现,4 用于不可能在1,2,3之前出现
  • 拓扑排序不是传统的排序算法,一个图可能有多种拓扑排序

下图的拓扑排序是: 1,3,2,4 或者 3,1,2,4,有两种拓扑排序
在这里插入图片描述

拓扑排序的代码思路 — 利用广度优先搜索(BFS)

  1. 统计每个点的 in-degree
  2. 将每个in-degree为0的点放进队列 (Queue),作为初始值
  3. 不断的从队列里拿出一个点 (pop操作), 将这个点的所有邻居的indegree减1
  4. 如果发现有新的indegree为0的点,则放入队列
  5. 重复3,4步,直到队列为空

Example:
Step 1: 初始化队列:
Queue: {1,3} 因为1和3的indegree为0
Output: { };
在这里插入图片描述

Step 2:队首元素出队放入output, 更新2的indegree为 1
Queue: {3}
Output: {1};
在这里插入图片描述

Step 3: 队首元素出队放入output, 更新2的indegree为 0, 同时将 2 放进 Queue
Queue: {2}
Output: {1, 3};
在这里插入图片描述

Step 4: 队首元素出队放入output, 更新4的indegree为 0, 同时将 4 放进 Queue
Queue: {4}
Output: {1, 3, 2};
在这里插入图片描述

Step 3: 队首元素出队放入output, Queue为空,结束顺换,排序完成
Queue: {}
Output: {1, 3, 2, 4};

拓扑排序的实现

/**
 * Definition for Directed graph.
 * class DirectedGraphNode {
 *     int label;
 *     ArrayList<DirectedGraphNode> neighbors;
 *     DirectedGraphNode(int x) { label = x; neighbors = new ArrayList<DirectedGraphNode>(); }
 * };
 */

public class Solution {
   
    /*
     * @param graph: A list of Directed graph node
     * @return: Any topological order for the given graph.
     */
    public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
   
    
        ArrayList<DirectedGraphNode> outputList = new ArrayList<DirectedGraphNode>();
        //用于储存每个点的inderee
        HashMap
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值