C++实现AOE网中的关键路径算法及机动时间计算算法(邻接表存储)

代码如下:

#include <iostream>
#include <stack>
using namespace std;
const int N = 100;typedef struct Node
{int adj;int w;Node *next;}Node;typedef struct VNode
{int in;int v;Node *first;VNode(){first = nullptr;}
}VNode;class AOE
{
private:VNode adjList[N];int vn;int en;int tpord[N];int ve[N];int vl[N];bool coll[N];int path[N];bool vis[N];
public:AOE(){memset(ve, 0, sizeof(ve));memset(vl, 0, sizeof(vl));}void buildAOE(){int n, m;cin >> n >> m;vn = n;en = m;for (int i = 0; i < vn; i++){cin>>adjList[i].v;}for (int i = 0; i < en; i++){int x, y, w;cin >> x >> y >> w;Node *s = new Node;s->adj = y;s->w = w;s->next = adjList[x].first;adjList[x].first = s;}}void findIn(){for (int i = 0; i < vn; i++){adjList[i].in = 0;}for (int i = 0; i < vn; i++){for (Node *p = adjList[i].first; p; p = p->next){adjList[p->adj].in++;}}}bool toptpord(){stack<int>s;findIn();for (int i = 0; i < vn; i++){if (adjList[i].in == 0){s.push(i);}}int n = vn;int cnt = 0;while (!s.empty()){int xx = s.top();s.pop();tpord[cnt++] = xx;n--;for (Node *p = adjList[xx].first; p; p = p->next){int yy = p->adj;adjList[yy].in--;if (adjList[yy].in == 0){s.push(yy);}if (ve[xx] + p->w > ve[yy]){ve[yy] = ve[xx] + p->w;}}}if (!n){return true;}else{return false;}}bool criticPath(){if (!toptpord()) return false;for (int i = 0; i < vn; i++){vl[i] = ve[vn - 1];}for (int i = vn - 1; i >= 0; i--){int xx = tpord[i];for (Node *p = adjList[xx].first; p; p = p->next){int yy = p->adj;if (vl[yy] - p->w < vl[xx]){vl[xx] = vl[yy] - p->w;}}int e = 0;int l = 0;for (int i = 0; i < vn; i++) coll[i] = false;for (int i = 0; i < vn; i++){for (Node *p = adjList[i].first; p; p = p->next){int k = p->adj;e = ve[i];l = vl[k] - p->w;if (e == l){coll[i] = coll[k] = true;}}}}return true;}void freeTime()//求机动时间{for (int i = 0; i < vn; i++){int xx = i;for (Node *p = adjList[i].first; p; p = p->next){int yy = p->adj;if (vl[yy] - ve[xx] - p->w > 0){cout << "yy = "<<yy<<" vl[yy] = " << vl[yy] <<" xx = "<<xx<< " ve[xx] = " << ve[xx] << " p->w = " << p->w << endl;cout << xx << " " << yy <<" "<< vl[yy] - ve[xx] - p->w<< endl;}}}cout << endl;}void dfs(int v, int cnt, int ans){path[cnt++] = v;if (v == vn - 1){cout << "value = " << ans << endl;for (int i = 0; i < cnt; i++){cout << path[i] << " ";}cout << endl;return;}for (Node *p = adjList[v].first; p; p = p->next){int k = p->adj;if (!vis[k] && coll[k]){vis[k] = true;dfs(k, cnt, ans + p->w);vis[k] = false;}}}void printPath(){for (int i = 0; i < vn; i++) vis[i] = false;vis[0] = true;dfs(0, 0, 0);}};int main()
{AOE g;g.buildAOE();g.criticPath();g.printPath();g.freeTime();return 0;
}

测试如下:

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

.NET 开源项目 StreamJsonRpc 介绍[中篇]

阅读本文大概需要 11 分钟。上一篇介绍了一些预备知识&#xff0c;包括 JSON-RPC 介绍和实现了 JSON-RPC 的 StreamJsonRpc 介绍&#xff0c;讲到了 StreamJsonRpc 可以通过 .NET 的 Stream 类和 WebSocket 类实现 JSON-RPC 协议的通信。本篇就先选择其中的 Stream 类来讲解&am…

Istio 中的多集群部署与管理

本文节选自ServiceMesher 社区出品的开源电子书《Istio Handbook——Istio 服务网格进阶实战》&#xff0c;作者钟华&#xff0c;来自腾讯云。Istio 在 1.1 后提供了两类多集群的连通的部署模式&#xff1a;1. 多控制面2. 单控制面&#xff0c;也称为 “共享控制面” 模式多控制…

认证授权方案之授权初识

1.前言回顾&#xff1a;认证授权方案之JwtBearer认证在上一篇中&#xff0c;我们通过JwtBearer的方式认证&#xff0c;了解在认证时&#xff0c;都是基于Claim的&#xff0c;因此我们可以通过用户令牌获取到用户的Claims&#xff0c;在授权过程中对这些Claims进行验证&#xff…

[数据结构]树、森林与二叉树之间的相互转换方法

树、二叉树与森林的相互转换 本文只给出树、森林与二叉树之间的转换方法&#xff0c;而详细的证明过程不在本文讨论范围之内。 树 → 二叉树 在所有兄弟结点之间加一连线。 对每个结点&#xff0c;除了保留与其长子的连线外&#xff0c;去掉该结点与其它孩子的连线。 二叉树 …

Blazor.Server以正确的方式集成Ids4

&#xff08;一个真正的以后端形式来集成认证中心的方案&#xff09;❤本文导读首先特别感谢张善友老师提供技术指导&#xff0c;源于上周我发了一篇文章《[Mvp.Blazor] 集成Ids4&#xff0c;实现统一授权认证》&#xff0c;我本来是想通过像vue框架那样&#xff0c;通过引oidc…

作为一个有理想的程序员,必读的书都有哪些?

很多程序员朋友问我&#xff1a;“哪本最具影响力的书&#xff0c;是每个程序员都应该读的&#xff1f;” 笔者从事软件开发15年&#xff0c;看过的计算机相关的书籍不下百本了&#xff0c;如果非要推荐的话&#xff0c;给大家精选以下10本&#xff0c;希望对大家有所帮助&…

认证授权方案之JwtBearer认证

1.前言回顾&#xff1a;认证方案之初步认识JWT在现代Web应用程序中&#xff0c;即分为前端与后端两大部分。当前前后端的趋势日益剧增&#xff0c;前端设备&#xff08;手机、平板、电脑、及其他设备&#xff09;层出不穷。因此&#xff0c;为了方便满足前端设备与后端进行通讯…

使用过滤器模式,让客户关怀中的代码更加干净整洁

一&#xff1a;实际场景介绍我们在给用户做订单催付通知的时候&#xff0c;会有这样的一种场景&#xff0c;用户在系统后台设置一组可以催付的规则&#xff0c;比如说订单金额大于xx元&#xff0c;非黑名单用户&#xff0c;来自哪个地区&#xff0c;已购买过某个商品&#xff0…

C++实现各种排序以及复杂度,稳定性分析

代码如下: #include<iostream> using namespace std;void Bubble_Sort(int *a, int n) {bool flag;int tmp 0;for (int i n - 1; i > 0; i--){flag false;for (int j 0; j < i; j){if (a[j] > a[j 1]){swap(a[j], a[j 1]);flag true;}}if (!flag) break…

Webapi管理和性能测试工具WebBenchmark

WebBenchmark是一款基于开源通讯组件Beetlex扩展的Webapi管理和性能测试工具&#xff0c;在传统工具中一般管理工具缺乏性能压测能力或有性能压测的缺少管理功能&#xff1b;WebBenchmark的设计目标是就管理和性能测试能力同时具备。接下来介绍一下工具的功能和使用&#xff1a…

Abstract Factory(抽象工厂)--对象创建模式

Abstract Factory &#xff08;抽象工厂&#xff09;–对象创建模式 一、意图 提供一个创建一系列相关或者相互依赖的接口&#xff0c;而无需指定它们具体的类。 二、动机 1.在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工 作;同时&#xff0c;由于需求…

Builder(生成器)--对象创建型模式

Builder&#xff08;生成器&#xff09;–对象创建型模式 一、意图 将一个复杂的对象构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 二、动机 1.在软件系统中&#xff0c;有时候面临着“一个复杂对象”的创建工作&#xff0c;其通常由各个部分的子对…

Gartner:缺乏技术人才将影响企业数字化转型

导语大多数公司在数字化转型的阶段对所需的技能方面都处于“盲目”状态。正文随着COVID-19响应加快了数字化转型的速度和规模&#xff0c;缺乏数字化技能可能会危害人才计划不统一的公司。甚至在冠状病毒大流行之前&#xff0c;董事会就将数字/技术中断列为2020年的头等大事&am…

DEBUG org.springframework.web.servlet.DispatcherServlet - Error rendering view [org.thymeleaf.spring

报错信息如下: 报错原因: thymeleaf有一些限制&#xff0c;使用th语言&#xff0c;内容为空就会报错 改成这样解决问题:

Factory Method(工厂方法)--对象创建型模式

Factory Method&#xff08;工厂方法&#xff09;–对象创建型模式 一、意图 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 二、动机 1.在软件系统中&#xff0c;经常面临着创建对象的工作;由于需求的变化…

全内存的redis用习惯了?那能突破内存限制类redis产品ssdb呢?

首先说一下背景&#xff0c;在双十一的时候&#xff0c;我们系统接受X宝的订单推送&#xff0c;原先的实现方式是使用 redis 的 List 作为推送数据的承载&#xff0c;在非大促的场景下&#xff0c;一切运行正常&#xff0c;内存占用大概3-4G&#xff0c;机器是16G内存。由于提前…

Prototype(原型)--对象创建模式

Prototype&#xff08;原型&#xff09;–对象创建模式 一、意图 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 二、动机 1.在软件系统中&#xff0c;经常面临着“某些结构复杂的对象”的创建工作&#xff1b;由于需求的变化&#xff0c;这些…