关键路径

简介: 关键路径

关键路径的求法一般是针对有向无环图的,常用来解决工程中的问题,前面我们学过Bellman和SPFA算法,如果我们给每条边变成相反数就可以求解关键路径了,当然关键路径不止一种求法,数据结构中给出的关键路径求法的优势在于其更快,利用了ve,vl数组,下面是其代码。

#include<iostream>
#include<stack>
#include<queue> 
#include<vector>
#include<algorithm>
using namespace std;
const int maxv=1001;
struct node{
  int v,w;
};
vector<node>Adj[maxv];//定义邻接表
int indegree[maxv];//存储入度 
int ve[maxv],vl[maxv];
stack<int>s;//存储拓扑排序,逆向输出为逆拓扑排序
bool topological(int n) {  //拓扑排序,生成事件最早开始时间 
  fill(ve,ve+n+1,0);//从前向后推 
  queue<int>q;
  for(int i=1;i<=n;i++) 
  if(indegree[i]==0)
  q.push(i);
  while(!q.empty()){
    int t=q.front();q.pop();
      s.push(t);
      for(int i=0;i<Adj[t].size();i++){
        int x=Adj[t][i].v,w=Adj[t][i].w;
        indegree[x]--;
        if(indegree[x]==0)
        q.push(x);
        if(ve[t]+w>ve[x])//x位置的最早时间等于之前最长的路 
        ve[x]=ve[t]+w;
    }
  }
  if(s.size()==n)return true;
  return false;
}
int createvl(int n) {//生成事物的最迟开始时间 
   int maxlength=0;
   for(int i=1;i<=n;i++)   //找到汇点 
   if(ve[i]>maxlength)
   maxlength=ve[i];
  fill(vl,vl+n+1,maxlength);//从后往前推 
  while(!s.empty()){
    int t=s.top() ;s.pop(); 
    for(int i=0;i<Adj[t].size();i++)
    {   
        int x=Adj[t][i].v;
      if(vl[x]-Adj[t][i].w<vl[t]) 
      //t处最迟开始时间等于 之后路径最迟开始时间的最小值 
      vl[t]=vl[x]-Adj[t][i].w;
    }
  } 
  return maxlength;
}
int criticalpath(int n) {
  if(topological(n)==false)
  return-1;
 int  k=createvl(n);
  for(int i=1;i<=n;i++)
  for(int j=0;j<Adj[i].size();j++){
    int x=Adj[i][j].v,w=Adj[i][j].w;
    int e=ve[i],l=vl[x]-w;
    if(e==l)
    printf("%d->%d\n",i,x);
  }
  return k; //返回路径和 
}
 int main(){
  int n,m,x,y,w;
  scanf("%d%d",&n,&m);
  node t;
  fill(indegree,indegree+n+1,0);
  for(int i=1;i<=m;i++){
    scanf("%d%d%d",&x,&y,&w);
    t.v=y;t.w=w;
    Adj[x].push_back(t);
    indegree[y]++;
   }
   criticalpath(n);
  return 0;
 }
相关文章
|
6月前
|
弹性计算 网络安全 数据中心
阿里云创建专有网络VPC的【IPv4网段】如何选择?有什么区别?
阿里云VPC创建时需选IPv4网段,默认提供10.0.0.0/16、172.16.0.0/16、192.168.0.0/16,三者无功能差异。若仅单VPC且不连本地数据中心,可任选其一,确保不冲突即可。多VPC或混合云场景需规划避免IP重叠。不支持100.64.0.0/10等特殊网段。建议结合IPAM进行地址管理。
|
存储 API 对象存储
OSS新特性:支持文件上传、复制时,指定Object的存储类型以及修改已有文件的存储类型
用户在上传、复制文件时,可灵活地指定文件的存储类型为Standard、IA、Archive;用户也可以修改实时修改文件的存储类型,比如从低频型(IA)修改为标准型。
5993 0
|
5月前
|
存储 域名解析 缓存
DNS工作原理:从域名到IP
每天输入域名就能访问网站,背后靠的是DNS——互联网的“地址翻译官”。它将域名智能解析为IP地址,实现快速访问。本文详解DNS记录类型(A、CNAME、MX等)与四级查询流程,助你理解“域名变IP”的全过程,轻松应对解析问题。
1170 157
|
8月前
|
人工智能 自然语言处理 数据可视化
AI视频培训|格律诗AI 视频创作与自媒体传播——某诗词学会
近日,TsingtaoAI派驻专家团队为某诗词学会学员交付《格律诗AI 视频创作与自媒体传播》培训。本课程精准切中行业痛点——传统诗词创作与现代传播方式的断层。课程摒弃泛泛而谈,直击实操:首日聚焦"工具认知+创作逻辑",系统梳理即梦、可灵等国产AI工具在格律诗意象可视化中的差异化应用,如将"月光在指尖碎裂"转化为动态场景;次日深入"语音表达+自媒体运营",传授用魔音工坊生成情感化配音、坤行数字人打造诗人形象的秘技,更结合抖音、小红书平台特性,解析"前5秒高光片段设计"等流量密码。
677 3
|
Java Maven Android开发
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
本文介绍了Spring Boot开发环境的搭建和项目启动流程。主要内容包括:jdk的配置(IDEA、STS/eclipse设置方法)、Spring Boot工程的构建方式(IDEA快速构建、官方构建工具start.spring.io使用)、maven配置(本地maven路径与阿里云镜像设置)以及编码配置(IDEA和eclipse中的编码设置)。通过这些步骤,帮助开发者顺利完成Spring Boot项目的初始化和运行准备。
1148 0
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
|
7月前
|
定位技术
基于vue3.5+vite7+element-plus网页聊天系统
最新版vite7.1+vue3.5+element-plus仿微信web网页版聊天vite7-webchat。
400 4
|
9月前
|
索引
HashMap 原理
HashMap 底层采用数组、链表与红黑树结合的结构。通过 key 的 hashCode 定位数组索引,实现高效存取。当发生哈希冲突时,使用链表解决;链表过长则转化为红黑树,提升查找效率至 O(log n)。扩容时,默认容量为16,负载因子0.75,容量翻倍并重新计算索引。Put 方法流程包括:计算 hash、初始化数组、确定索引、处理冲突(链表或红黑树),并根据情况扩容或树化。
|
9月前
|
存储 NoSQL Dubbo
Java主流分布式解决方案多场景设计与实战
本文介绍了Java领域的主流分布式技术,涵盖分布式服务框架(如Dubbo、Spring Cloud)、分布式数据存储(如Redis、MongoDB)、分布式锁(如ZooKeeper、Redisson)及分布式事务(如Seata、Hmily),并通过电商项目案例分析了这些技术在实际开发中的应用,帮助开发者应对高并发与大数据挑战。
430 0
|
机器学习/深度学习 存储 人工智能
2024阿里云AI交出答卷,全球领先!
2024阿里云AI交出答卷,全球领先!
870 9
2024阿里云AI交出答卷,全球领先!
|
存储 C语言
中缀表达式转后缀表达式
本文提供了一个C语言程序,用于将中缀表达式转换为后缀表达式,并计算后缀表达式的结果,包括处理运算符优先级、括号匹配以及基本的四则运算。
593 0
下一篇
开通oss服务