关键路径

简介: 关键路径

关键路径的求法一般是针对有向无环图的,常用来解决工程中的问题,前面我们学过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;
 }
相关文章
|
关系型数据库 MySQL Windows
mysql彻底卸载干净的5个步骤,超多图超详细保姆级教程最新教程新手小白轻松上手
mysql彻底卸载干净的5个步骤,超多图超详细保姆级教程最新教程新手小白轻松上手
25170 2
|
架构师 Java
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
206 0
|
7月前
|
Java Maven Android开发
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
本文介绍了Spring Boot开发环境的搭建和项目启动流程。主要内容包括:jdk的配置(IDEA、STS/eclipse设置方法)、Spring Boot工程的构建方式(IDEA快速构建、官方构建工具start.spring.io使用)、maven配置(本地maven路径与阿里云镜像设置)以及编码配置(IDEA和eclipse中的编码设置)。通过这些步骤,帮助开发者顺利完成Spring Boot项目的初始化和运行准备。
570 0
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
|
1月前
|
NoSQL 关系型数据库 BI
如何开发一套固定资产管理系统?(附架构图+流程图+代码参考)
固定资产管理涉及采购、入库、维修、盘点、报废等多个环节,是企业资产保值增值的关键。本文详解固定资产管理系统(FAMS)的核心功能、系统架构、资产全生命周期流程,并提供功能设计、开发实操技巧与关键代码示例,涵盖台账、申购、入库、报修、处置、盘点等重点模块。内容聚焦企业落地实践,帮助提升资产管理效率、降低风险、保障审计合规。
|
前端开发 NoSQL 关系型数据库
Kong网关介绍以及在Docker上部署容器以及Dashboard
Kong 是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能
2343 0
Kong网关介绍以及在Docker上部署容器以及Dashboard
|
关系型数据库 C++ 容器
Qt开发技术:QCharts(一)QCharts基本介绍以及图表框架详解
Qt开发技术:QCharts(一)QCharts基本介绍以及图表框架详解
Qt开发技术:QCharts(一)QCharts基本介绍以及图表框架详解
|
5月前
|
PyTorch API 算法框架/工具
DeepSeek 部署方式与技术实践
DeepSeek的部署灵活性使其在多个领域大放异彩,但需根据场景权衡性能、成本与安全性。随着工具生态的完善与行业方案的沉淀,2025年将成为AI大模型落地关键年。开发者应持续关注MoE、COT等技术创新,结合自身需求选择最优部署策略。
334 1
|
26天前
|
存储 人工智能 Serverless
企业级 AI Agent 开发指南:基于函数计算 FC Sandbox 方案实现类 Chat Coding AI Agent
本文深入解析AI Agent系统架构,特别是以Sandbox为核心的落地实践。聚焦泛Chat模式下AI应用的挑战与解决方案,涵盖会话亲和性、隔离性、存储机制、会话恢复、资源弹性等关键技术点,阿里云函数计算(FC)为 AI Agent 系统在企业中的落地实践提供实际解决方案,展示了如何高效、安全地构建可扩展的 AI 应用系统。
|
25天前
|
定位技术
基于vue3.5+vite7+element-plus网页聊天系统
最新版vite7.1+vue3.5+element-plus仿微信web网页版聊天vite7-webchat。
146 4