C/C++: 关键路径

        关键路径在找最早发生时间的时候要正着找,找最晚发生时间的时候要找到最后一个终点的最早发生时间后,倒着减去每个边的权值,就是各点的最晚发生时间。

        具体注释在文中。

/**
*
* Althor: Hacker Hao
* Create: 2023.12.13    /!ATTENTION!/
* Meaning: This article commemorates the Nanjing Massacre
*/
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 10;
int vexnum, arcnum;  //顶点个数和边的个数
int vet[MAX], vlt[MAX];  //各点的最早发生时间和最晚发生时间的集合

//注意,文章没有设置活动的最早、最晚时间。因为用点求出每个点的最早和最晚相同时便输出,利用循环
//把每个关键路径都在循环中输出

struct EdgeNode
{
	int adjvex;
	int value;
	EdgeNode* nextarc;
};

struct VexNode
{
	int indegree;
	int data;
	EdgeNode* firstarc;
};

VexNode Vex[MAX];   //顶点集合

/*
* eet:EdgeEarlyTime
* elt:EdgeLaterTime
* vet:VexEarlyTime
* vlt:VexLaterTime
*/

//在拓扑排序中,up利用了同一个for循环,顺便把各点的最早发生时间求出了
bool TopoSort(vector<int>& topo)
{
	stack<int> stack;
	for (int i = 0; i < vexnum; i++)
	{
		if (Vex[i].indegree == 0)
			stack.push(i);      //先把里面入度为0的进栈一下
	}

	while (!stack.empty())       //栈不能为空,否则就是结束了
	{
		int top = stack.top();
		stack.pop();
		topo.push_back(top);       //保存出栈的值到vector向量中
        

        //一定注意,这是在邻接表中遍历每个边(就是小链表的挨个遍历)
		for (EdgeNode* e = Vex[top].firstarc; e != NULL; e = e->nextarc)
		{
			int end = e->adjvex;
			Vex[end].indegree--;
			if (Vex[end].indegree == 0)
				stack.push(end);
			if (vet[top] + e->value > vet[end])
				vet[end] = vet[top] + e->value;
		}
	}

	if (topo.size() < vexnum)
		return false;       //存在环,不合适
	else
		return true;
}

void CriticalPath()        //关键路径
{
	vector<int> topo;
	TopoSort(topo);

	for (int i = 1; i <= vexnum; i++)
		vlt[i] = vet[vexnum];

	//倒过来求各点的vlt
	for (int i = topo.size() - 1; i >= 0; i--)
	{
		int pre = topo[i];
		for (EdgeNode* e = Vex[pre].firstarc; e != NULL; e = e->nextarc)
		{
			int end = e->adjvex;
			if (vlt[end] - e->value < vlt[pre])  //倒着从终点求vlt
				vlt[pre] = vlt[end] - e->value;
		}
	}

	//通过vet和vlt求eet和elt
	cout << "以下为关键路径: " << endl;
	for (int i = 1; i <= vexnum; i++)
	{
		for (EdgeNode* e = Vex[i].firstarc; e != NULL; e = e->nextarc)
		{
			int end = e->adjvex;
			int eet = vet[i];
			int elt = vlt[end] - e->value;
			if (eet == elt)
				cout << "v" << i << "->" << "v" << end << ", " << e->value << endl;

		}
	}

}

int main()
{
	cout << "请输入顶点数和边数:" << endl;
	cin >> vexnum >> arcnum;
	cout << "请输入每个边依赖的两个顶点和权值:" << endl;
	for (int i = 0; i < arcnum; i++)
	{
		int x, y, z;
		cin >> x >> y >> z;    //出点,入点,权值
		Vex[y].indegree++;     //入点的入度++
		EdgeNode* e = new EdgeNode;

		e->adjvex = y;         //赋值
		e->value = z;

		e->nextarc = Vex[x].firstarc;
		Vex[x].firstarc = e;      //把e这个点加入到邻接表中

	}
	CriticalPath();   //关键路径函数
	return 0;

}
//输入:
6 8
1 2 3
1 3 2
3 4 4
4 6 2
2 5 3
2 4 2
3 6 3
5 6 1

输出:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Python监控服务器在线状态

前言 在公司内网有一台服务器&#xff0c;有动态的公网IP&#xff0c;使用DDNS对外提供服务&#xff0c;但是会因为停电、服务器卡死等原因导致服务器离线。服务器离线后无法及时获知&#xff0c;因此需要实现在服务器离线的时候能够发送消息到手机上。 思路梳理 公司办理的…

【JAVA】黑马MybatisPlus 学习笔记【二】【核心功能】

2.核心功能 刚才的案例中都是以id为条件的简单CRUD&#xff0c;一些复杂条件的SQL语句就要用到一些更高级的功能了。 2.1.条件构造器 除了新增以外&#xff0c;修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法除了以id作为where条件以外&…

java面试题-Spring事务以及@Transactional注解详解

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 对于这个面试中高频问到…

关于“Python”的核心知识点整理大全18

目录 ​编辑 8.5 传递任意数量的实参 pizza.py 8.5.1 结合使用位置实参和任意数量实参 8.5.2 使用任意数量的关键字实参 user_profile.py 8.6 将函数存储在模块中 8.6.1 导入整个模块 pizza.py making_pizzas.py 8.6.2 导入特定的函数 8.6.3 使用 as 给函数指定别名…

[Vulnhub靶机] DriftingBlues: 7

[Vulnhub靶机] DriftingBlues: 7靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues7_vh.ova 靶机地址&#xff1a;192.168.67.25 攻击机地址&#xff1a;192.168.67.3 一、信息收集 …

苹果电脑双开

1.第一步&#xff1a;在应用程序中找到微信 复制一个副本出来 2.第二步:打开复制的《微信副本》 右键打开 – 显示包内容 3.第三步:Contents - info.plist 后右键 打开方式 选择 文本编辑 4.第四步&#xff1a;找到查找和替换 这一段com.tencent.xinWeChat 后面是修改 com.tenc…

微软AutoGen框架:AI的新时代,你的新机遇

一、引言 在科技日新月异的今天&#xff0c;人工智能已经深入到我们生活的各个角落。无论是智能手机、智能家居还是自动驾驶汽车&#xff0c;人工智能的应用无处不在。而在这个领域中&#xff0c;微软AutoGen框架无疑是一颗璀璨的新星。它以其独特的创新性和实用性&#xff0c…

matlab信号分选系统算法-完整算法结构

matlab信号分选系统算法 针对得到的脉冲流PDW进行信号分选&#xff0c;包括重频恒定、重频抖动、重频参差和重频滑变四种脉间调制类型。   这里我们先进行数据的仿真&#xff0c;后续边仿真边分享思路&#xff1a;首先根据信号类型&#xff0c;分别产生重频恒定、重频抖动、重…

亚马逊、速卖通、虾皮等平台有哪些测评补单方案,哪个比较好用

随着全球电子商务的迅速发展&#xff0c;跨境电商环境的潜力和机遇日益显现。跨境卖家们可以更便捷地将产品销售到全球市场&#xff0c;但同时也面临着更激烈的竞争、更严格的规定和更高的运营成本等挑战。在这个环境中&#xff0c;如何抓住机遇并克服挑战&#xff0c;成为了所…

AI全栈大模型工程师(二十七)如何部署自己 fine-tune 的模型

服务器价格计算器 火山引擎提供的这个价格计算器很方便&#xff0c;做个大概的云服务器 GPU 选型价格参考。其它服务厂商价格相差不是很多。 https://www.volcengine.com/pricing?productECS&tab2 高稳定和高可用地部署模型 序号模块名称描述1负载均衡将流入的请求分发到多…

Python进阶(一)

1.Python中一切皆对象 1.1 Python中一切皆对象 JAVA中有class和object这两个概念&#xff0c;object只是class的一个实例。 而在Python中面向对象更加的彻底&#xff0c;class和函数都是对象。代码也是对象&#xff0c;模块也是对象。 函数和类也是对象&#xff0c;对象有四…

代码随想录刷题题Day12

刷题的第十二天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day12 任务 ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2 1 层序遍历 一口气做十题 102.二叉树的层序遍历 107.二叉树的…

恢复出厂设置后在 Android 上恢复照片的 6 种常用方法

恢复出厂设置可帮助您删除电子设备的所有信息并将其恢复到原始系统状态。但是&#xff0c;如果您不小心按下了恢复出厂设置按钮并从 Android 设备中删除了所有难忘的照片&#xff0c;该怎么办&#xff1f;好吧&#xff0c;您无需担心&#xff0c;因为可以通过以下一些方法来恢复…

03 python循环语句

3.1while循环基本语法 # 演示while循环的基础应用i0 while i<100 :print(不到100)i 1while循环基本案例 import random num random.randint(1, 100) count 0 while True:guess_num int(input(随机输入数字&#xff1a;))count 1if guess_num num :print(jie shu)br…

C++构造函数列表初始化的优点

构造函数的执行可以分成两个阶段&#xff0c;初始化阶段和计算阶段&#xff0c;初始化阶段先于计算阶段。而初始化阶段就是对应着初始化列表那部分&#xff0c;而计算阶段就是构造函数的函数体部分。初始化阶段先于计算阶段执行。 #include<iostream>class Demon { publ…

Cent OS7 磁盘挂载:扩展存储空间和自动挂载

文章目录 &#xff08;1&#xff09;概述&#xff08;2&#xff09;查看磁盘使用情况&#xff08;3&#xff09;VMware虚拟机挂载磁盘&#xff08;4&#xff09;物理机磁盘挂载&#xff08;5&#xff09;ntfs硬盘处理 &#xff08;1&#xff09;概述 在Linux系统中&#xff0c…

数据结构和算法 - 前置扫盲

数据结构和算法 一、前置扫盲 1、数据结构分类 1.1 逻辑结构&#xff1a;线性与非线性 tip&#xff1a;逻辑结构揭示了数据元素之间的逻辑关系。 线性数据结构&#xff1a;元素间存在明确的顺序关系。 数据按照一定顺序排列&#xff0c;其中元素之间存在一个对应关系&#x…

Axure 9基本元件,表单及表格元件简介,表单案例

目录 一.基本元件 1.元件基本介绍 2.基本元件的使用 二.表单及表格元件 三.表单案例 四.简单简历绘制 一.基本元件 1.元件基本介绍 概述 - 在Axure RP中&#xff0c;元件是**构建原型图的基础模块**。 将元件从元件库里拖拽到画布中&#xff0c;即可添加元件到你的原型…

【洛谷算法题】P1422-小玉家的电费【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P1422-小玉家的电费【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…

2023前端面试题总结:JavaScript篇完整版

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 JavaScript基础知识 JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; Number&#xff08;数字&#xff09;: 用于表示数值&#xff0c;可…