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

}
相关推荐
m0_639906946 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
2601_9707038310 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
丘山望岳15 小时前
单调栈和单调队列
数据结构
UIU11418 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
黎相思21 小时前
BTree
数据结构·b树·b+树
UIU1141 天前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
niyongsheng1 天前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
叉烧滑蛋2 天前
B站台湾大学郭彦甫|MATLAB 学习笔记|04 变量与档案存取
数据结构
j7~2 天前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
not coder2 天前
一文讲通--从树到红黑树
数据结构·算法