代码随想录算法训练营第五十六天 | 图 | 拓扑排序(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]);
    }

}
相关推荐
想唱rap1 小时前
Linux下进程的状态和优先级
linux·运维·服务器·开发语言·数据结构·算法
Croa-vo2 小时前
逆袭Akuna Quant!美硕秋招亲历,从网申到拿offer全攻略
数据结构·经验分享·算法·面试·职场和发展
vir023 小时前
交换瓶子(贪心)
数据结构·算法
952364 小时前
数据结构-二叉树
java·数据结构·学习
HUTAC5 小时前
重要排序算法(更新ing)
数据结构·算法
冉佳驹5 小时前
数据结构 ——— 八大排序算法的思想及其实现
c语言·数据结构·排序算法·归并排序·希尔排序·快速排序·计数排序
Hello_Embed6 小时前
FreeRTOS 入门(四):堆的核心原理
数据结构·笔记·学习·链表·freertos·
烧冻鸡翅QAQ6 小时前
考研408笔记——数据结构
数据结构·笔记·考研
异步的告白7 小时前
C语言-数据结构-2-单链表程序-增删改查
c语言·开发语言·数据结构
Gorgous—l8 小时前
数据结构算法学习:LeetCode热题100-图论篇(岛屿数量、腐烂的橘子、课程表、实现 Trie (前缀树))
数据结构·学习·算法