代码随想录算法训练营day58:图论08:拓扑排序精讲;dijkstra(朴素版)精讲

news2024/11/24 15:01:35

拓扑排序精讲

卡码网:117. 软件构建(opens new window)

题目描述:

某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。请编写一个算法,用于确定文件处理的顺序。

输入描述:

第一行输入两个正整数 M, N。表示 N 个文件之间拥有 M 条依赖关系。

后续 M 行,每行两个正整数 S 和 T,表示 T 文件依赖于 S 文件。

输出描述:

输出共一行,如果能处理成功,则输出文件顺序,用空格隔开。

如果不能成功处理(相互依赖),则输出 -1。

分析:

应用场景:对于复杂的依赖关系,给出线性的依赖顺序

eg:大学排课,例如 先上A课,才能上B课,上了B课才能上C课,上了A课才能上D课,等等一系列这样的依赖顺序。 问给规划出一条 完整的上课顺序。

概括来说,给出一个 有向图,把这个有向图转成线性的排序 就叫拓扑排序

当然拓扑排序也要检测这个有向图 是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的。

所以拓扑排序也是图论中判断有向无环图的常用方法

思路 bfs:

**初始化:

因为是有向,可以用邻接表记录

需要记录每个结点的入度(在vnode里可以记录,注意s->t的边,t的innode++),和每个结点的依赖关系

for循环:循环n次,因为要把所有的点都取出来

1、找开头 入度为0的结点,加入结果集

**开头的结点入度=0

找入度为0 的节点,我们需要用一个队列放存放。

因为每次寻找入度为0的节点,不一定只有一个节点,可能很多节点入度都为0,所以要将这些入度为0的节点放到队列里,依次去处理。

加入队列之后,入度改为-1,这样不会重复影响结果

2、把这个结点从图上去掉

反复,直到所有节点都被删除

实际上操作时,要把 该节点作为出发点所连接的节点的 入度 减一。

eg:准备删0,那就是把1和2的结点入度-1

判断有向环的方式:

如果我们发现结果集元素个数 不等于 图中节点个数,我们就可以认定图中一定有 有向环!

#include <math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>

typedef struct arcnode{
    int node;
    struct arcnode *nextnode;
}Arcnode;

typedef struct {
    int into;
    Arcnode *firstarc;
}Vnode;

typedef struct {
    Vnode list[1000];
}graph;

int main(){
    int n,m;
    scanf("%d%d",&n,&m);

    graph* g=(graph* )malloc(sizeof(graph));//用邻接表
    for(int i=0;i<n;i++) g->list[i].firstarc=NULL;
    for(int i=0;i<n;i++) g->list[i].into = 0;

    for(int i=0;i<m;i++){
        int s,t;
        scanf("%d%d",&s,&t);
        Arcnode *p=(Arcnode *)malloc(sizeof(Arcnode));
        p->node=t;
        p->nextnode=g->list[s].firstarc;
        g->list[s].firstarc = p;
        g->list[t].into++;
    }

    int queue[60000];
    int front=-1,rear=-1;
    int count=0;
    int *ans = (int*)malloc(sizeof(int)*n);

    for(int i=0;i<=n-1;i++){
        for(int j=0;j<n;j++){//所有入度为0的结点都进队
            if(g->list[j].into==0){
                rear++;
                queue[rear]=j;
                g->list[j].into=-1;
               
            }
        }

        front++;//出一个入度为0的结点,并且记录
        int s = queue[front];
        ans[count++]=s;
        
        

        Arcnode*p = g->list[s].firstarc;//把以该结点为起点,终点处的入度都-1
        while(p!=NULL){
            int w = p->node;
            g->list[w].into--;
            p=p->nextnode;
        }
    }

    if(count!=n) printf("-1");
    else {
        for(int i=0;i<n-1;i++) printf("%d ",ans[i]);
        printf("%d",ans[n-1]);
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4_PMSM基于s函数的仿真建模_1

为了检验电机仿真模型的正确性&#xff0c;&#xff0c;以基于s函数方法搭建的数学模型为例&#xff0c;搭建如图的三相所示的简单三相PMSM矢量控制系统&#xff0c;此模型忽略了PWM逆变器的影响。另外&#xff0c;感兴趣的同志可以对基于Simulink方法搭建的仿真模型进行验证。…

二叉树详解(2)

文章目录 4. 二叉树链式结构的实现5. 二叉树基础oj练习 4. 二叉树链式结构的实现 首先&#xff0c;我们先要了解一下二叉树的遍历顺序有哪些&#xff1a; 通过了解二叉树的遍历顺序&#xff0c;我们不难看出要实现二叉树的遍历需要用到递归&#xff0c;而使用递归我们就要思…

基于STM32开发的智能电力监控与管理系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化电流电压数据采集与处理能耗计算与负载管理OLED显示与状态提示Wi-Fi通信与远程监控应用场景 工业设施的电力监控与优化智能家居中的电力管理与节能常见问题及解决方案 常见问题解决…

【C++ 面试 - STL】每日 3 题(二)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

Code Practice Journal | Day58_Graph08 Topological Sorting

1. 概念 在一个有向无环图(DAG)中&#xff0c;根据节点的依赖关系&#xff0c;对所有的节点进行线性排序的算法 拓扑排序的结果不一定是唯一的 2. 实现 2.1 BFS&#xff08;卡恩算法&#xff09; 1、步骤 2、代码实现 以KamaCoder 117.软体构建 题目&#xff1a;117. 软件…

Stable Diffusion绘画 | 插件-宽高比调整助手:让计算器毕业

在调整图片宽高时&#xff0c;如果每次都需要用计算器根据比例算好&#xff0c;再手工输入&#xff0c;非常影响效率。 推荐使用以下的插件&#xff0c;来实现高效准确地调整图片宽高比例。 Aspect Ratio Helper 安装地址&#xff1a;https://github.com/thomasasfk/sd-webui…

80、k8s概念及组件介绍

一、k8s kubernetes:k8s----希腊语&#xff0c;舵手&#xff0c;飞行员 1.1、k8s作用&#xff1a; ​ 用于自动部署&#xff0c;扩展&#xff0c;管理容器化部署的应用程序。开源&#xff08;半开源。&#xff09; ​ k8s的底层语言是由go语言。 ​ k8s理解成负责自动化运…

Jetson Orin Nano GPIO 舵机

jetson orin nano 40针引脚扩展接头&#xff1a; 图源 Jetson Orin Nano Developer Kit User Guide - | NVIDIA Developer 引脚配置 使用jetson-io tool配置引脚&#xff1a; sudo /opt/nvidia/jetson-io/jetson-io.py 选择“Configure Jetson 40pin Header”: "Confi…

啥是纳米微纤维?咋制作?有啥用?

大家好&#xff0c;今天我们来聊聊纳米/微纤维——《Tailoring micro/nano-fibers for biomedical applications》发表于《Bioactive Materials》。这些纤维近年来备受关注&#xff0c;因为它们具有独特的功能和性质&#xff0c;在生物医学等领域有广泛应用。它们可以通过多种技…

滴滴出行:分布式数据库的架构演进之路|OceanBase案例

本文作者&#xff1a;吴其朋&#xff0c;滴滴分布式存储运维负责人 滴滴出行&#xff0c;作为一个集网约车、出租车、顺风车、代驾等多种出行方式于一体的综合性出行服务平台&#xff0c;其用户遍布全球&#xff0c;总数已突破6.5亿。面对如此多样化的出行需求及庞大的用户群体…

Python优化算法18——教与学优化算法(TLBO)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…

800G和1.6T以太网:创新与挑战

随着大数据、5G网络、云计算和物联网&#xff08;IoT&#xff09;技术的广泛应用&#xff0c;市场对带宽和数据传输速率的更高需求日益增长&#xff0c;800G和1.6T网络速率的升级备受期待。本文将从800G以太网和1.6T网络在升级方面的所做出的创新举措及其所面临的主要挑战两个方…

小柴冲刺软考中级嵌入式系统设计师系列一、计算机系统基础知识(4)计算机硬件组成及主要部件

目录 计算机系统的基本硬件组成包括 一、中央处理单元 1、CPU的功能 2、CPU的组成 运算器&#xff1a;是数据加工和处理的部件&#xff0c;是执行部件 控制器&#xff1a;运算器只能完成运算&#xff0c;而控制器用于控制整个CPU的工作&#xff0c;它决定了计算机的运行过…

ChatGPT、Claude 和 Gemini 在数据分析方面的合作(第 3 部分):机器学习的最佳 AI 助手

人工智能如何加速你的机器学习项目从特征工程到模型训练 人工智能如何加速你的机器学习项目从特征工程到模型训练 欢迎来到雲闪世界。 在本文中&#xff0c;我们将重点介绍这些 AI 工具如何协助机器学习项目。机器学习是数据科学的基石。虽然使用 LLM 模型完全自动化建模过程具…

代码随想录算法训练营_day32

题目信息 509. 斐波那契数 题目链接: https://leetcode.cn/problems/fibonacci-number/description/题目描述: 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也…

【0-1背包hard】力扣3181. 执行操作可获得的最大总奖励 II

给你一个整数数组 rewardValues&#xff0c;长度为 n&#xff0c;代表奖励的值。 最初&#xff0c;你的总奖励 x 为 0&#xff0c;所有下标都是 未标记 的。你可以执行以下操作 任意次 &#xff1a; 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。 如果 rewardValues[i] 大…

【C++11及其特性】左值和右值

左值和右值目录 一.左值和右值的报错1.简单定义2.函数返回值作左值3.表达式作左值 二.存储的层次结构1.CPU2.内存3.磁盘4.三者联系5.寄存器 三.左值和右值的概念1.左值2.右值3.转换 一.左值和右值的报错 1.简单定义 赋值号’左边的为左值,右边的为右值. 2.函数返回值作左值 …

html2Canvas和jspdf导出长pdf

续使用html2canvas和jspdf导出pdf包含跨页以及页脚_jspdf.umd.min.js-CSDN博客我的这篇文章再写一种情况因为最近我也使用到了 具体的html2Canvas和jspdf的我就不说了&#xff0c;直接开始了&#xff0c; 在公共方法的文件夹中建立一个新的文件htmlToPdf.js用来写咱们得方法然…

亦菲喊你来学机器学习(17) --DBSCAN聚类算法

文章目录 DBSCAN聚类算法基本概念算法步骤特点构建模型模型参数训练模型完整代码展示 总结 DBSCAN聚类算法 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;是一种基于密度的空间聚类算法&#xff0c;它能够将具有足够高密度的区…

宿舍|基于SprinBoot+vue的宿舍管理系统(源码+数据库+文档)

宿舍管理系统 基于SprinBootvue的私人诊所管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员功能实现 学生功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&…