




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《数据结构与算法》关键路径
源程序清单
#include<stdio.h>
#include<stdlib.h>
#include<iomanip.h>
ttinclude<process.h>
typedefstructnode〃边表结点
{
intadjvex;〃邻接点编号
intdut;〃弧的信息
structnode*next;〃下一条弧指针
}edgenode;
typedefstruct〃顶点表结点
(
intprojectname;〃顶点域
intid;〃顶点的入度信息
edgenode*link;〃边表头指针
}vexnode;
voidCreateGraphic(vexnode*Graphicmap,int
projectnumber,intactivenumber)ffl
intbegin,end,duttem;
〃分别代表弧的前节点,尾节点,活动时间
edgenode*p;〃边表头指针
for(inti=0;i<projectnumber;i++)
(
Graphicmap[i].projectname=i;
//顶点的命名按0,1,2,3.....
Graphicmap[i].id=0;
〃顶点的信息的度数均赋为零
Graphicmap[i].link=NULL;
)
printf(〃\n〃);
printf(〃请输入某项目的信息,并请用整形数字
表示(格式:弧头,弧尾,权值):\n〃);
printf(〃例如:输入1,2,4即代表结点1与2
之间的活动需要4个时间单位。\n〃);
printf(〃\n〃);
for(intk=0;k<activenumber;k++)
//activenumber为活动的数目,即弧的条数
(
scanf(〃%d,%d,%d〃,&begin,&end,&duttem);
〃请输入第%d条的起点、终点和权值
p=(edgenode*)malloc(sizeof(edgenode));//临
时分配存储空间
p->adjvex二endT;〃因为是从零开始记的,
故要减1,就是让终点插入到邻接表内
p->dut=duttem;
〃该弧的活动时间为duttem
Graphicmap[end-1].id++;
〃入度加1
p->next=Graphicmap[begin-1].link;
Graphicmap[begin-1].link=p;〃让下一个
节点作为下一插入节点的前驱节点
intSearchMapPath(vexnode*
Graphicmap,intprojectnumber,int
activenumber
,int&totaltime)
〃求出最大路径,并打印出关键路径
{
inti,j,k,m=0;
intfront=-l,rear=-l;
int*
topologystack=(int*)malloc(projectnumber*si
zeof(int));
〃用来保存拓扑排列
int*vl二(int*)malloc
(projectnumber*sizeof(int));
〃用来表示在不推迟整个工程的前提下,Vj允许
最迟发生的时间
int*ve=(int*)malloc
(projectnumber*sizeof(int));
〃用来表示Vj最早发生时间
int*1=(int*)malloc
(activenumber*sizeof(int));〃用来表示活动
Ai最迟完成开始时间
int*e=(int*)malloc
(activenumber*sizeof(int));〃表示活动最早开
始时间
edgenode*p;//边表头的指针
totaltime=0;〃存放整个工程的最短时间
for(i=0;i<projectnumber;i++)ve[i]=0;
〃先把每个工程的最早发生时间初始化为零
for(i=0;i<projectnumber;i++)
if(Graphicmap[i].id==O)
{
topologystack[++rear]=i;
〃让所有的头节点入队列
m++;
〃记录入队列的顶点个数
)
)
while(front!=rear)
(
front++;//出队列
j=topologystack[front];
〃拓扑排序的节点依次出队列
p=Graphicmap[j].link;
〃指向顶点指向的下一个顶点
while(p)
(
k=p->adjvex;//邻接点编号
Graphicmap[k].id一;
〃让入度减1,相当于删除一个入度为零的前驱节
点,和相关的弧
if(ve[j]+p->dut>ve[k])
〃将最长的路径赋给VE[K]
ve[k]=ve[j]+p->dut;
if(Graphicmap[k].id==0)
〃如果入度为零,则入队列
(
topologystack[++rear]=k;
m++;〃记录入队列的节点个数
)
p=p->next;〃指向下一个节点
)
}
if(m<projectnumber)
〃如果有环,则不能遍历每个节点
(
printf(,z\n本程序所建立的图有回路不可计
算出关键路径!\n〃);
printf(〃将退出本程序!\n〃);
return0;
}
totaltime=ve[projectnumber-1];
〃最短完成时间即为最后一个节点所
〃累加的时间之和
for(i=0;Kprojectnumber;i++)
vl[i]=totaltime;
〃初始化所有顶点的最迟时间为最长
for(i=projectnumber-2;i>=0;i--)
//用逆拓扑排序来求活动Ai最迟完成
〃开始时间,即从最后一个节点减去最短
〃的时间
(
j二topologystack[i];
p=Graphicmap[j].link;
while(p)
{
k=p->adjvex;
if((vl[k]-p->dut)<vl[j])
vl[j]=vl[k]-p->dut;
p=p->next;
)
)
i=0;
printf(〃\n〃);
printf(z/1起点|终点|最早开始时间|最
迟完成时间I差值I备注\n〃);
for(j=0;j<projectnumber;j++)
|
p=Graphicmap[j].link;
while(p)
k=p->adjvex;
e[++i]=ve[j];
1[i]=vl[k]-p->dut;
printfC|%4d|%4d|%lld|%lld
%3d|z/,Graphicmap[j].projectname
+1,Graphicmap[k].projectname
+1,e[i],1[i],1[i]-e[i]);
if(l[i]==e[i])〃当差值为零时,则为关
键路径
printfC关键活动〈%2d,%4d>〃,
Graphicmap[j].projectname
+1,Graphicmap[k].projectname+1);
printf(〃\n〃);
p=p->next;
}
)
return1;
)
voidseekkeyroot()〃求关键路径的主函数
{
int
projectnumber,activenumber,totaltime=0;
printf(〃\n〃);
printf(〃输入符合标准,欢迎进入求关键路径的
系统!\n〃);
printf(〃\n〃);
printf(〃请输入这个项目的AOE-网的节点数:
〃);
scanf(〃%d〃,&projectnumber);
printf(〃请输入这个项目的AOE-网的活动个数:
〃);
scanf(〃%d〃,&activenumber);
vexnode*
Graphicmap=(vexnode*)malloc(projectnumber*s
izeof(vexnode));
CreateGraphic(Graphicmap,projectnumber,acti
venumber);〃创建邻接图
SearchMapPath(Graphicmap,projectnumber,acti
venumber,totaltime);〃求出最大路径,并打印出
关键路径
printf(〃\n〃);
printf(〃整个工程所用的最短时间为:%d个单
位时间\n〃,totaltime);
system(〃pause〃);
intmain()
charch;
for(;;)
(
do
(
system(〃cls〃);
printf
★\n〃);
printf(〃
欢迎进入求关键路径算法程序
\n〃);
printf
\n〃);
printf(〃%s〃,〃\ns(start)开始输入
工程的节点数据并求出关键路径\n〃);
printf(〃\n〃);
printf(〃如〃,〃e(exi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙大宁波理工学院《装配式建筑》2023-2024学年第二学期期末试卷
- 宁夏卫生健康职业技术学院《边坡与基坑工程》2023-2024学年第二学期期末试卷
- 新版汽车维修工考试技巧试题及答案
- 咸阳职业技术学院《界面交互设计》2023-2024学年第二学期期末试卷
- 整形外科主治医师:男性外生殖器畸形、泌尿外科学真题一
- 硬件基础知识考题及答案
- 河北地质大学华信学院《工程编程语言》2023-2024学年第二学期期末试卷
- 2025年济南历程区九年级中考语文一模考试试题(含答案)
- 学校风险管控责任清单校园安全风险管控工作实施方案
- 异形斜拉桥施工方案
- 新版中国食物成分表
- 无人机应用与基础操控入门课件
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
- 债权法学习通超星期末考试答案章节答案2024年
- 安全生产标准化基本规范评分表
- 《Linux网络操作系统实用教程(CentOS8)第2版》全套教学课件
- 2015年919公务员联考《申论》政法干警河北卷及参考答案
- 幼儿园中班语言散文欣赏《芽》课件
- 汽轮发电机组轴系扭振在线监测、分析与保护系统研究
- 期中测试卷(1-4单元)(试题)-2023-2024学年六年级下册数学苏教版
- 医务人员不良执业行为记分管理制度
评论
0/150
提交评论