代码随想录算法训练营第五十六天 | 图 | 拓扑排序(BFS)

Day 56 总结

  • 自己实现中遇到哪些困难
  • 今日收获,记录一下自己的学习时间
    • 18:00 - ???

拓扑排序

  • 节点存在依赖关系,对这些依赖进行线性规划

  • 有向无环图 进行线性排序的算法 都可以叫做 拓扑排序

  • BFS实现

    • 找到入度为0 的节点,加入结果集
    • 将该节点从图中移除
  • 判断有环

    • 当不存在入度为0的节点时,结果集元素个数 不等于 图中节点个数,存在环
  • 代码

    • 记录度数

    • 收集结果

    • 图的构建

117 软件构建

题目连接: 117. 软件构建

题目描述:

文件 0 - N-1, 文件之间存在依赖关系,确定文件处理顺序。

输入:

N 个文件, M个依赖关系 + S -> T

输出:

按序处理文件的顺序

实现思路:

BFS法,找到入度为0的节点,删除其依赖,加入结果集。

java 复制代码
public class Main {
    public static void main (String[] args){
        new Main().solve();
    }

    public void solve() {
        Scanner in = new Scanner(System.in);

        int N = in.nextInt();
        int[] degreess = new int[N];
        int[][] graph = new int[N][N];
        int[] res = new int[N];
        int[] visited = new int[N];

        // 获取图的信息,记录入度
        int M = in.nextInt();
        for (int i=0; i<M; i++) {
            int S = in.nextInt();
            int T = in.nextInt();
            graph[S][T] = 1;
            degreess[T]++;
        }

        // 拓扑排序
        for (int i=0; i<N; i++) {
            // 挑选入度为0的节点
            int node = -1;
            for (int j=0; j<N; j++) {
                if (visited[j] == 0 && degreess[j] == 0){
                    node = j;
                    visited[node] = 1;
                    break;
                }
            }
            
            // 遇到环
            if (node == -1) {
                System.out.println(-1);
                return;
            }

            // 将该几点从图中移除
            for (int j=0; j<N; j++) {
                if (graph[node][j] == 1) {
                    degreess[j] --;
                }
            }
            // 添加至结果集合
            res[i] = node;
        }
        
        for (int i=0; i<N-1; i++)
            System.out.print(res[i] + " ");
        System.out.println(res[N-1]);
    }

}
相关推荐
Fanxt_Ja1 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
今后1231 天前
【数据结构】二叉树的概念
数据结构·二叉树
散1122 天前
01数据结构-01背包问题
数据结构
消失的旧时光-19432 天前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww2 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
苏小瀚2 天前
[数据结构] 排序
数据结构
睡不醒的kun2 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌2 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
Whisper_long2 天前
【数据结构】深入理解堆:概念、应用与实现
数据结构
IAtlantiscsdn2 天前
Redis7底层数据结构解析
前端·数据结构·bootstrap