图的拓扑排序算法

简介: 图的拓扑排序算法

要求:一定是有向无环图

1)在图中找到所有入度为0的点输出

2)把所有入度为0的点在图中删掉,继续找入度为0的点输出,周而复始

3)图的所有点都被删除后,依次输出的顺序就是拓扑排序

应用:事件安排、编译顺序

分析:

 1 准备一个HashMap,key是某个结点,value是某个结点的剩余入度;再准备一个队列,只有入度为零的结点才进入这个对队列。

 2  一开始遍历图中所有的点集,每个点的入度就是默认原来的;一开始肯定有入度为零的结点,所以将其加入队列

  3 准备一个列表,用来接收队列弹出的结点,因为队列中的顺序就是拓扑排序的顺序

  4 队列不为空的时候,就弹出;并且让列表接收。然后遍历弹出结点的所有直接邻居(就是弹出结点的邻接点),将所有邻接点的入度都减一;之后HashMap表里面再有入度为零的点就继续加入队列…

   5最后返回列表,就是拓扑排序的结果

package com.harrison.class11;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import com.harrison.class11.Code01_NodeEdgeGraph.Graph;
import com.harrison.class11.Code01_NodeEdgeGraph.Node;
public class Code04_TopologySort {
  public static List<Node> topologySort(Graph graph){
    HashMap<Node, Integer> inMap=new HashMap<>();
    Queue<Node> zeroInQueue=new LinkedList<>();
    for(Node node:graph.nodes.values()) {
      inMap.put(node, node.in);
      if(node.in==0) {
        zeroInQueue.add(node);
      }
    }
    List<Node> ans=new LinkedList<>();
    while(!zeroInQueue.isEmpty()) {
      Node cur=zeroInQueue.poll();
      ans.add(cur);
      for(Node next:cur.nexts) {
        inMap.put(next, inMap.get(next)-1);
        if(inMap.get(next)==0) {
          zeroInQueue.add(next);
        }
      }
    }
    return ans;
  }
}


相关文章
|
4月前
|
人工智能 算法 BI
【优选算法专栏】专题十八:BFS解决拓扑排序(一)
【优选算法专栏】专题十八:BFS解决拓扑排序(一)
40 0
|
4月前
|
算法
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
42 1
|
3月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
36 4
|
4月前
|
存储 人工智能 算法
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
284 0
|
2月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
26 1
|
2月前
|
数据采集 存储 算法
「AIGC算法」图搜索算法详解
本文探讨了图搜索算法,包括遍历和最短路径搜索。DFS和BFS是遍历算法,前者使用栈深入搜索,后者用队列逐层遍历。Dijkstra、Bellman-Ford、A*、Floyd-Warshall和Johnson算法则解决最短路径问题。文中还给出了DFS的Python实现示例。这些算法在路径规划、网络分析等领域有重要应用。
32 0
|
3月前
|
存储 算法
算法BFS经典例题(迷宫,多源BFS,BFS解决拓扑排序,FloodFill算法)
算法BFS经典例题(迷宫,多源BFS,BFS解决拓扑排序,FloodFill算法)
|
3月前
|
算法 Java 调度
Java数据结构与算法:拓扑排序
Java数据结构与算法:拓扑排序
|
4月前
|
存储 算法 C++
c++算法学习笔记 (8) 树与图部分
c++算法学习笔记 (8) 树与图部分
|
3月前
|
算法 计算机视觉
图像处理之基于图的广度优先搜索组件标记算法
图像处理之基于图的广度优先搜索组件标记算法
20 0