版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《數(shù)據(jù)結(jié)構(gòu)與算法》關(guān)鍵路徑
源程序清單
#include<stdio.h>
#include<stdlib.h>
#include<iomanip.h>
ttinclude<process.h>
typedefstructnode〃邊表結(jié)點(diǎn)
{
intadjvex;〃鄰接點(diǎn)編號(hào)
intdut;〃弧的信息
structnode*next;〃下一條弧指針
}edgenode;
typedefstruct〃頂點(diǎn)表結(jié)點(diǎn)
(
intprojectname;〃頂點(diǎn)域
intid;〃頂點(diǎn)的入度信息
edgenode*link;〃邊表頭指針
}vexnode;
voidCreateGraphic(vexnode*Graphicmap,int
projectnumber,intactivenumber)ffl
intbegin,end,duttem;
〃分別代表弧的前節(jié)點(diǎn),尾節(jié)點(diǎn),活動(dòng)時(shí)間
edgenode*p;〃邊表頭指針
for(inti=0;i<projectnumber;i++)
(
Graphicmap[i].projectname=i;
//頂點(diǎn)的命名按0,1,2,3.....
Graphicmap[i].id=0;
〃頂點(diǎn)的信息的度數(shù)均賦為零
Graphicmap[i].link=NULL;
)
printf(〃\n〃);
printf(〃請輸入某項(xiàng)目的信息,并請用整形數(shù)字
表示(格式:弧頭,弧尾,權(quán)值):\n〃);
printf(〃例如:輸入1,2,4即代表結(jié)點(diǎn)1與2
之間的活動(dòng)需要4個(gè)時(shí)間單位。\n〃);
printf(〃\n〃);
for(intk=0;k<activenumber;k++)
//activenumber為活動(dòng)的數(shù)目,即弧的條數(shù)
(
scanf(〃%d,%d,%d〃,&begin,&end,&duttem);
〃請輸入第%d條的起點(diǎn)、終點(diǎn)和權(quán)值
p=(edgenode*)malloc(sizeof(edgenode));//臨
時(shí)分配存儲(chǔ)空間
p->adjvex二endT;〃因?yàn)槭菑牧汩_始記的,
故要減1,就是讓終點(diǎn)插入到鄰接表內(nèi)
p->dut=duttem;
〃該弧的活動(dòng)時(shí)間為duttem
Graphicmap[end-1].id++;
〃入度加1
p->next=Graphicmap[begin-1].link;
Graphicmap[begin-1].link=p;〃讓下一個(gè)
節(jié)點(diǎn)作為下一插入節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)
intSearchMapPath(vexnode*
Graphicmap,intprojectnumber,int
activenumber
,int&totaltime)
〃求出最大路徑,并打印出關(guān)鍵路徑
{
inti,j,k,m=0;
intfront=-l,rear=-l;
int*
topologystack=(int*)malloc(projectnumber*si
zeof(int));
〃用來保存拓?fù)渑帕?/p>
int*vl二(int*)malloc
(projectnumber*sizeof(int));
〃用來表示在不推遲整個(gè)工程的前提下,Vj允許
最遲發(fā)生的時(shí)間
int*ve=(int*)malloc
(projectnumber*sizeof(int));
〃用來表示Vj最早發(fā)生時(shí)間
int*1=(int*)malloc
(activenumber*sizeof(int));〃用來表示活動(dòng)
Ai最遲完成開始時(shí)間
int*e=(int*)malloc
(activenumber*sizeof(int));〃表示活動(dòng)最早開
始時(shí)間
edgenode*p;//邊表頭的指針
totaltime=0;〃存放整個(gè)工程的最短時(shí)間
for(i=0;i<projectnumber;i++)ve[i]=0;
〃先把每個(gè)工程的最早發(fā)生時(shí)間初始化為零
for(i=0;i<projectnumber;i++)
if(Graphicmap[i].id==O)
{
topologystack[++rear]=i;
〃讓所有的頭節(jié)點(diǎn)入隊(duì)列
m++;
〃記錄入隊(duì)列的頂點(diǎn)個(gè)數(shù)
)
)
while(front!=rear)
(
front++;//出隊(duì)列
j=topologystack[front];
〃拓?fù)渑判虻墓?jié)點(diǎn)依次出隊(duì)列
p=Graphicmap[j].link;
〃指向頂點(diǎn)指向的下一個(gè)頂點(diǎn)
while(p)
(
k=p->adjvex;//鄰接點(diǎn)編號(hào)
Graphicmap[k].id一;
〃讓入度減1,相當(dāng)于刪除一個(gè)入度為零的前驅(qū)節(jié)
點(diǎn),和相關(guān)的弧
if(ve[j]+p->dut>ve[k])
〃將最長的路徑賦給VE[K]
ve[k]=ve[j]+p->dut;
if(Graphicmap[k].id==0)
〃如果入度為零,則入隊(duì)列
(
topologystack[++rear]=k;
m++;〃記錄入隊(duì)列的節(jié)點(diǎn)個(gè)數(shù)
)
p=p->next;〃指向下一個(gè)節(jié)點(diǎn)
)
}
if(m<projectnumber)
〃如果有環(huán),則不能遍歷每個(gè)節(jié)點(diǎn)
(
printf(,z\n本程序所建立的圖有回路不可計(jì)
算出關(guān)鍵路徑!\n〃);
printf(〃將退出本程序!\n〃);
return0;
}
totaltime=ve[projectnumber-1];
〃最短完成時(shí)間即為最后一個(gè)節(jié)點(diǎn)所
〃累加的時(shí)間之和
for(i=0;Kprojectnumber;i++)
vl[i]=totaltime;
〃初始化所有頂點(diǎn)的最遲時(shí)間為最長
for(i=projectnumber-2;i>=0;i--)
//用逆拓?fù)渑判騺砬蠡顒?dòng)Ai最遲完成
〃開始時(shí)間,即從最后一個(gè)節(jié)點(diǎn)減去最短
〃的時(shí)間
(
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起點(diǎn)|終點(diǎn)|最早開始時(shí)間|最
遲完成時(shí)間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])〃當(dāng)差值為零時(shí),則為關(guān)
鍵路徑
printfC關(guān)鍵活動(dòng)〈%2d,%4d>〃,
Graphicmap[j].projectname
+1,Graphicmap[k].projectname+1);
printf(〃\n〃);
p=p->next;
}
)
return1;
)
voidseekkeyroot()〃求關(guān)鍵路徑的主函數(shù)
{
int
projectnumber,activenumber,totaltime=0;
printf(〃\n〃);
printf(〃輸入符合標(biāo)準(zhǔn),歡迎進(jìn)入求關(guān)鍵路徑的
系統(tǒng)!\n〃);
printf(〃\n〃);
printf(〃請輸入這個(gè)項(xiàng)目的AOE-網(wǎng)的節(jié)點(diǎn)數(shù):
〃);
scanf(〃%d〃,&projectnumber);
printf(〃請輸入這個(gè)項(xiàng)目的AOE-網(wǎng)的活動(dòng)個(gè)數(shù):
〃);
scanf(〃%d〃,&activenumber);
vexnode*
Graphicmap=(vexnode*)malloc(projectnumber*s
izeof(vexnode));
CreateGraphic(Graphicmap,projectnumber,acti
venumber);〃創(chuàng)建鄰接圖
SearchMapPath(Graphicmap,projectnumber,acti
venumber,totaltime);〃求出最大路徑,并打印出
關(guān)鍵路徑
printf(〃\n〃);
printf(〃整個(gè)工程所用的最短時(shí)間為:%d個(gè)單
位時(shí)間\n〃,totaltime);
system(〃pause〃);
intmain()
charch;
for(;;)
(
do
(
system(〃cls〃);
printf
★\n〃);
printf(〃
歡迎進(jìn)入求關(guān)鍵路徑算法程序
\n〃);
printf
\n〃);
printf(〃%s〃,〃\ns(start)開始輸入
工程的節(jié)點(diǎn)數(shù)據(jù)并求出關(guān)鍵路徑\n〃);
printf(〃\n〃);
printf(〃如〃,〃e(exi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度全屋衣柜定制環(huán)保材料研究與開發(fā)合同3篇
- 2025年度全新官方版離婚協(xié)議書及婚姻財(cái)產(chǎn)分割執(zhí)行監(jiān)督協(xié)議3篇
- 二零二五年度內(nèi)墻膩?zhàn)邮┕づc智能家居控制系統(tǒng)合同3篇
- 2025年度智能汽車買賣與數(shù)據(jù)共享合作協(xié)議3篇
- 二零二五年度租賃房屋租賃保證金收取合同2篇
- 2025年度公司企業(yè)間智慧城市建設(shè)項(xiàng)目借款合同2篇
- 2025年度新能源電池研發(fā)與生產(chǎn)合同3篇
- 二零二五年度互聯(lián)網(wǎng)企業(yè)高管股權(quán)激勵(lì)聘用合同3篇
- 二零二五年度紙裝修工程節(jié)能評(píng)估合同3篇
- 2025年度養(yǎng)殖場季節(jié)性用工合同2篇
- 改革開放史智慧樹知到期末考試答案2024年
- 2024五凌電力限公司招聘5人高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 市政公司3年戰(zhàn)略規(guī)劃方案
- 2024年全國中考英語試單選(動(dòng)詞時(shí)態(tài))
- 2024年江蘇護(hù)理職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 血糖儀使用規(guī)范課件
- DB21-T 2931-2018羊肚菌日光溫室栽培技術(shù)規(guī)程
- 貴州省黔東南州2023-2024學(xué)年九年級(jí)上學(xué)期期末文化水平測試化學(xué)試卷
- 《空調(diào)零部件介紹》課件
- 2024年度醫(yī)院內(nèi)分泌與代謝科述職報(bào)告課件
- 手術(shù)室無菌操作流程
評(píng)論
0/150
提交評(píng)論