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

}
相关推荐
张小姐的猫1 小时前
【AI大模型接入SDK】 —— 前端页面 & 项目总结与拓展
前端·数据结构·数据库·c++·人工智能·chatgpt
sunburn-2 小时前
Java 排序算法详细教学:从冒泡排序到快速排序
java·开发语言·数据结构·ide·算法
bksczm3 小时前
零基础面试题1
jvm·数据结构·算法
sogw-三叶草️3 小时前
LeetCode206. 反转链表
数据结构·链表
careathers3 小时前
【数据结构】二叉树
数据结构·算法
轩轶子4 小时前
Python CLI Todo:一次数据结构错误引发的 Bug
数据结构·python·bug
CQU_JIAKE5 小时前
9.28【A】
数据结构
code斗13 小时前
Java数据结构:堆详解
java·开发语言·数据结构
Elaine33616 小时前
数据结构与算法-程序
数据结构·python·算法·计算机基础·编程基础
Logic10117 小时前
C语言/数据结构位运算题解:异或XOR找出游戏速通中的“独特初始能量值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质