逐行解释代码#include iostream#includevector#includequeue#includeasserthusing namespace std;struct Node int vertex; int priority; int count; bool operatorconst Node &other const if priority otherprio
这段代码实现了一个网络任务调度的算法。
首先,包含了一些头文件,如iostream、vector、queue、assert.h,用于实现输入输出、存储数据以及进行断言。
然后定义了一个结构体Node,用于表示网络中的一个节点。它包含三个成员变量:vertex(节点的标号)、priority(节点的优先级)、count(节点被执行的次数)。 在结构体内部还重载了小于号运算符,用于比较节点的优先级。
接下来是主函数main()。 首先禁用了输入输出的同步。 然后声明了一些变量n、m、l、r、e、p、v、s、k用于存储输入的数据。 接着定义了一个大小为n+1的vector容器point,用于存储每个节点的可执行次数。 再定义了一个大小为n+1的queue容器的vector,用于存储网络中的每个节点以及其相邻节点的优先级。 然后通过循环读入每个节点的信息,并将其存储到对应的queue容器中。在读入相邻节点信息后,还对其进行了降序排序。 最后将每个节点的相邻节点队列存储到网络中的对应位置。
接下来是一个循环,用于处理m个任务: 首先读入任务的起始节点s和需要执行的步数k。 然后定义了一些变量用于存储任务的执行情况,如是否存在多个路径、上一个节点、当前节点、路径中的索引、最早发现的坏节点等。 接着定义了两个大小为n+1的vector容器safe和pre,用于记录节点是否安全以及节点在路径中的先后顺序。 再定义了一个大小为n+1的vector容器time,用于记录节点被执行的次数。 最后定义了一个大小为n+1的vector容器path,用于存储任务执行过程中经过的节点的顺序。 接下来是具体的任务执行过程: 首先判断起始节点是否为坏节点,若是,则将bad置为0。 然后将起始节点加入路径中,并更新节点的执行次数、上一个节点和路径中的索引。 接着通过循环执行任务的步数: 判断上一个节点是否还有相邻节点,若有,则将当前节点设为相邻节点队列的第一个节点,并将其加入路径中。 判断当前节点是否已经在路径中出现过,若是,则说明存在多个路径,将multiple置为true,并记录下路径中的索引。 更新当前节点的执行次数和上一个节点,并判断当前节点是否为坏节点。 若存在多个路径,则计算出路径的长度、整除的次数和余数,并对路径中的节点进行相应的处理。 最后更新节点的执行次数和上一个节点,并判断当前节点是否为坏节点。
接下来是对网络中的每个节点进行处理: 对于非空的相邻节点队列,判断节点的类型(好节点或坏节点),并根据节点的执行次数和安全性进行相应的处理。 若节点为好节点,则判断节点的执行次数,若为1且不是上一个节点,则将其执行次数加1,并将节点的优先级降低。 若节点为坏节点,则判断节点的执行次数,若小于l,则将节点的执行次数加1,并将节点的优先级降低。 最后输出上一个节点和是否存在坏节点。
整个算法的思想是根据任务的执行步数,逐个将任务经过的节点加入路径中,并根据节点的类型和执行次数进行相应的处理。同时,还需要判断是否存在多个路径和是否存在坏节点
原文地址: https://www.cveoy.top/t/topic/hBHs 著作权归作者所有。请勿转载和采集!