博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6)图[4]关键路径
阅读量:7020 次
发布时间:2019-06-28

本文共 4022 字,大约阅读时间需要 13 分钟。

关键路径求解

 

1 #include "iostream"  2 #include "vector"  3 #include "stack"  4 using namespace std;  5   6 const int MaxNumVertex  = 20; //最大顶点数  7 const int infinity = 65535;//无穷大  8 typedef int elementtype;       //elementtype 为int 型  9 class graph{ 10 public: 11     graph(); 12     ~graph(); 13     elementtype insertvertex(elementtype v); //在图中增加一个顶点 14     elementtype insertedge(elementtype v,elementtype u,elementtype weight);//在图中增加一条从v顶点到u顶点的弧 15     elementtype firstadj(elementtype v);//求图g中顶点v的第一个邻接点 16     elementtype nextadj(elementtype v,elementtype m);//求图中顶点v的m邻接点之后的邻接点 17     elementtype firstpre(elementtype v);//求图中顶点v的第一个前驱 18     elementtype nextpre(elementtype v,elementtype m);//求图中顶点v的m前驱点之后的前驱点 19     elementtype degreein(elementtype v);//求图中顶点v的入度数 20     elementtype FindDegreein(elementtype ind[]);//各顶点的入度存放于入度数组中 21     elementtype degreeout(elementtype v);//求图中顶点v的入度数 22     elementtype FindDegreeout(elementtype oud[]);//各顶点的入度存放于入度数组中 23     elementtype EW(elementtype E[]);//最早发生时间的求解 24     bool CriticalPath();//关键路径 25     elementtype create();//创建图 26     int  CurrentVertex;//当前顶点数 27  28 private: 29     elementtype vertex[MaxNumVertex];//顶点表 30     elementtype edge[MaxNumVertex][MaxNumVertex];//图中弧的类型 31      32 }; 33  34 /* 35 *初始化 36 */ 37 graph::graph() 38 { 39     CurrentVertex = 0;  40     int i,j; 41     for (i=MaxNumVertex-1;i>=1;i--) 42     { 43         for (j=MaxNumVertex-1;j>=1;j--) 44         { 45             edge[i][j] = 0; 46  47         } 48     } 49      50 } 51  52 /* 53 *在图中增加一个顶点 54 */ 55 elementtype graph::insertvertex(elementtype v) 56 { 57     //判断这个顶点是否已经存在 58     int i; 59     bool flags = true; 60     for(i=1; i<=CurrentVertex; i++) 61     { 62         if(vertex[i]==v) 63         { 64             flags = false; 65             break; 66         } 67     } 68      69     if(flags) 70     { 71         CurrentVertex++; 72         vertex[CurrentVertex] = v; 73     }else{ 74         cout<
<<"顶点已经存在!"<
"<
<<"这条弧弧已经存在!"<
s;//定义并初始索要用到的栈231 elementtype ind[MaxNumVertex];//求各顶点的入度存放于入度数组ind中232 FindDegreein(ind);//233 234 for(i=1;i<=CurrentVertex;i++)//各个结点最早发生时间的初始化235 {236 E[i] = -1;237 }238 239 240 for(i=1;i<=CurrentVertex;i++)//将入度为0的顶点入栈241 {242 if(ind[i]==0)243 {244 s.push(i);245 v = i;246 E[i] = 0;//第一个入度为0的结点的最早发生时间为0247 }248 }249 int count =0;//用于统计已经完成的结点数目250 while(!s.empty())251 {252 x = s.top();253 count++;//计数254 s.pop();255 w = firstadj(x);//开始对v的各个后继顶点的入度-1256 while(w!=0)257 {258 if(E[w]<(E[x]+edge[x][w]))259 {260 E[w] = E[x]+edge[x][w];//更新w的最早发生时间261 }262 if(!(--ind[w]))//若w的入度-1后为0,则入栈263 {264 s.push(w);265 }266 w = nextadj(x,w);267 }268 }269 if(count
s;//定义并初始索要用到的栈281 elementtype ind[MaxNumVertex];//求各顶点的入度存放于入度数组ind中282 elementtype outd[MaxNumVertex];//求各顶点的出度存放于出度数组outd中283 elementtype E[MaxNumVertex];284 elementtype L[MaxNumVertex];285 FindDegreein(ind);//求各个结点的入度286 FindDegreeout(outd);//求各个结点的出度287 EW(E);//求各个结点的最早发生时间288 289 for(i=1;i<=CurrentVertex;i++)290 {291 L[i] = infinity;//各个结点最迟发生时间的初始化292 }293 for(i=1;i<=CurrentVertex;i++)//将出度为0的顶点入栈294 {295 if(outd[i]==0)296 {297 s.push(i);298 v = i;299 L[i] = E[i];//第一个出度为0的结点的最迟发生时间300 }301 }302 int count =0;//用于统计已经完成的结点数目303 while(!s.empty())304 {305 x = s.top();306 count++;//计数307 s.pop();308 w = firstpre(x);//开始对v的各个前驱顶点的出度-1309 while(w!=0)310 {311 if(L[w]>(L[x]-edge[w][x]))312 {313 L[w] = L[x]-edge[w][x];//更新w结点的最迟发生时间314 }315 if(!(--outd[w]))//若w的出度-1后为0,则入栈316 {317 s.push(w);318 }319 w = nextpre(x,w);320 }321 322 }323 324 cout<<"E[i],L[i]:"<
";367 start = equal[i];368 if(start==end)369 {370 cout<
<
>numv;388 cout<<"input vertex(顶点):";389 for(i=1;i<=numv;i++)390 {391 cin>>v;392 insertvertex(v);393 }394 cout<<"input num(u,v,weight)(弧的数目):";395 cin>>numv;396 for(i=1;i<=numv;i++)397 {398 cout<<"u->v,weight:";399 cin>>u>>v>>weight;400 insertedge(u,v,weight);401 }402 cout<<"graph create finish!"<
<

原始AOV网:

每个节点的最早发生时间[圆框对应的内容]和最迟发生时间[方框对应的内容]:

程序运行结果:

 

转载于:https://www.cnblogs.com/minmsy/p/5012579.html

你可能感兴趣的文章
Java开发必须掌握的 21 个 Java 核心技术!
查看>>
DNS子域授权、view配置详解
查看>>
SpringBoot使用SOFA-Lookout监控
查看>>
Linux总结
查看>>
一招教你轻松从图像中裁剪出婚纱礼服和面纱
查看>>
vmware产品
查看>>
web移动端开发技巧与bc平台搭建注意事项
查看>>
UI设计师如何提升UI设计视觉体验?
查看>>
C语言学生成绩管理系统分享
查看>>
各种UNIX系统下root密码的修复
查看>>
博客园小技巧
查看>>
eclipse启动tomcat 404
查看>>
python 内置模块之logging
查看>>
JAVA打好基础,走向编程之路
查看>>
套接字选项(长篇,未完待更新)
查看>>
JS中Array数组的三大属性用法
查看>>
Java 框架
查看>>
day15--JavaScript
查看>>
java.lang.reflection打印一个类的全部信息
查看>>
OkHttpClient源码分析(四)—— CacheInterceptor
查看>>