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

}
相关推荐
近津薪荼16 分钟前
优选算法——双指针8(单调性)
数据结构·c++·学习·算法
松☆18 分钟前
Dart 中的常用数据类型详解(含 String、数字类型、List、Map 与 dynamic) ------(2)
数据结构·list
历程里程碑1 小时前
Linux15 进程二
linux·运维·服务器·开发语言·数据结构·c++·笔记
嵌入小生0072 小时前
双向链表、双向循环链表之间的异同---嵌入式入门---Linux
linux·c语言·数据结构·链表·嵌入式·小白
独自破碎E2 小时前
【滑动窗口+计数】LCR015找到字符串中所有字母异位词
数据结构·算法
BoJerry7772 小时前
数据结构——单链表(不带头)【C】
c语言·开发语言·数据结构
-Try hard-2 小时前
数据结构 | 双向链表、双向循环链表、栈
数据结构·链表·vim
想进个大厂3 小时前
代码随想录day31 贪心05
数据结构·算法·leetcode
yyy(十一月限定版)3 小时前
寒假集训1——暴力和枚举
数据结构·算法
橘颂TA3 小时前
【剑斩OFFER】算法的暴力美学——力扣 207 题:课程表
数据结构·c++·算法·leetcode·职场和发展