关键路径

简介: 关键路径

关键路径的求法一般是针对有向无环图的,常用来解决工程中的问题,前面我们学过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;
 }
相关文章
|
人工智能 算法
图的应用——关键路径
图的应用——关键路径
425 0
图的应用——关键路径
|
3月前
|
搜索推荐 数据可视化 测试技术
迭代式开发:提升软件项目管理效率的关键路径
迭代式开发将软件项目划分为多个短周期,每个周期结束时交付一个可运行的版本,便于快速获取用户反馈并进行调整。与线性的瀑布模型相比,迭代式开发更具灵活性,能更好地应对需求变化。其核心在于小步快跑、快速反馈和持续改进。通过短周期迭代,团队能及时发现并解决问题,提高协作透明度,并根据用户意见不断优化产品。实施时需设定固定迭代周期、建立跨职能团队、采用持续集成与自动化测试,并重视每次迭代后的回顾与优化。尽管面临需求频繁变更、时间管理和团队协作等挑战,但借助现代办公协同工具,迭代式开发能显著提升项目管理效率,确保产品更贴近用户需求。
73 0
|
4月前
|
调度 项目管理 计算机视觉
『软件工程8』软件项目进度安排与跟踪,一招学会计算关键路径
该文章详细解释了如何在软件项目管理中安排进度与跟踪,特别是如何计算和利用关键路径方法(CPM)来优化项目时间管理。
|
8月前
|
搜索推荐 测试技术 C语言
设计求解AOE网关键路径程序(详细设计,附完整实现代码)
设计求解AOE网关键路径程序(详细设计,附完整实现代码)
|
算法
秒懂算法 | 活动安排问题贪心算法
通过例子分析求解活动安排问题的最好贪心策略、展示按照贪心策略求解该问题的过程。
508 0
秒懂算法 | 活动安排问题贪心算法
|
人工智能 算法
|
人工智能 算法
【数据结构】什么的图的关键路径?关键路径相关概念?关键路径算法实现?
【数据结构】什么的图的关键路径?关键路径相关概念?关键路径算法实现?
777 0
【数据结构】什么的图的关键路径?关键路径相关概念?关键路径算法实现?
|
算法 C++
C++实现图 - 06 关键路径
我们上一讲详细的讲述了拓扑排序的实现,为了就是给这一讲打下基础,因为这一讲我们将会讲关键路径,它就要用到拓扑排序的知识。
286 0
C++实现图 - 06 关键路径
|
算法
贪心算法——活动安排问题
贪心算法——活动安排问题
144 0
|
算法 调度
【回溯与分支限界法】最优调度问题
【回溯与分支限界法】最优调度问题
813 0