當前位置:編程學習大全網 - 編程語言 - 關鍵路徑規劃

關鍵路徑規劃

# include & ltiostream.h & gt

# include & ltstdlib.h & gt

# include & ltmalloc.h & gt

#定義最大20

Typedef struct node //定義AOV網鄰接鏈表的邊節點結構有向圖。

{

int vex//邊緣節點

結構節點* next//指向邊緣節點的指針

} edgenode

Typedef struct vnode //定義AOV網相鄰鏈表的邊節點結構的有向圖。

{

int id//穿透力

結構節點*鏈接;//頂點的指針

} vexnode

Typedef struct nodel //定義AOE網鄰接表的邊節點結構。

{

int adgvex//邊緣節點

int dut//重量

struct nodel * next//邊緣節點指針

} edgenodel

typedef struct v model//定義AOE網鄰接表的邊節點結構。

{

int頂點;//頂點

int id//穿透力

struct nodel * link//頂點的指針

} vexnodel

int na

//函數聲明

int creata OE(vex nodel dig[]);

int creata ov(vex node dig[]);

void toposort(vexnode dig[],int n);

void criticalpath(vexnodel dig[],int n);

void main()

{

vexnodel dig[max];//AOV的頂點數組

vex node dig 2[max];//AOE頂點數組

int n = 0;

int cord = 1;

while(1)

{

cout & lt& lt"-主菜單-"

cout & lt& lt"1.建立AOV鄰接表”

cout & lt& lt"2.建立AOE鄰接表”

cout & lt& lt"3.拓撲排序”

cout & lt& lt"4.找到關鍵路徑”

cout & lt& lt"0.退出"

cout & lt& lt"輸入您的選擇:"

CIN & gt;& gt軟線;

開關(電線)

{

案例1:n = creata ov(dig 2);

打破;

案例2:cout & lt;& lt”輸入邊數:“;

CIN & gt;& gtna;//AOE網絡的活動次數

n = creata OE(dig);

打破;

案例三:toposort(dig2,n);

打破;

案例4:criticalpath(dig,n);//找到關鍵路徑

打破;

案例0:出口(0);

}

}

}

int creatAOE(vexnodel dig[])

{

int vextotal,j,a,b,c;

edge nodel * p;

cout & lt& lt”輸入頂點數:“;

CIN & gt;& gtvextotal//輸入頂點的數量。

for(j = 0;j & ltmaxJ++) //進入AOE鄰接表。

{

挖[j]。頂點= j;//初始化頂點數組

挖[j]。id = 0;

挖[j]。link = NULL//頂點的指針

}

for(j = 1;j & lt= naj++)

{

cout & lt& lt“輸入邊緣

CIN & gt;& gta & gt& gtb & gt& gtc;//a是初始頂點,B是最終頂點,C是活動的權重。

挖[b]。id++;//滲透加壹。

p =(edge nodel *)malloc(sizeof(edge nodel));

p->;adg vex = b;

p->;dut = c;

p->;下壹個=挖[a]。鏈接;

挖。link = p;

}

cout & lt& lt“輸出鄰接表”endl

//進入AOV圖的鄰接表。

for(j = 1;j & lt= vextotalj++)

{

cout & lt& lt"頂點" < & ltj & lt& lt“滲透是”

p=dig[j]。鏈接;//頂點指針下移

而(p!=0)

{

cout & lt& lt"頂點" < & ltp->;adgvex & lt& lt“重量是”

p = p-& gt;接下來;

}

cout & lt& ltendl

}

返回vextotal

}

int creatAOV(vexnode dig[])

{

int vextotal,arcnumber,j,a,b;

edge node * p;//邊緣節點結構

cout & lt& lt”輸入邊數:“;

CIN & gt;& gtarcnumber

cout & lt& lt”輸入頂點數:“;

CIN & gt;& gtvextotal

//進入AOV圖的鄰接表。

for(j = 0;j & ltmaxJ++) //初始化

{

挖[j]。id = 0;

挖[j]。link = NULL//頂點指針為空

}

for(j = 1;j & lt= arcnumberj++)

{

cout & lt& lt"輸入由兩個頂點表示的邊:"

CIN & gt;& gta & gt& gtb;//輸入邊信息,其中A是起始頂點,B是最終頂點。

p =(edge node *)malloc(sizeof(edge node));

p->;vex = b;

p->;下壹個=挖[a]。鏈接;

挖。link = p;

挖[b]。id++;//滲透率加1

}

cout & lt& lt“輸出鄰接表”endl//進入AOV圖的鄰接表。

for(j = 1;j & lt= vextotalj++)

{

cout & lt& lt"頂點" < & ltj & lt& lt“滲透程度”

p=dig[j]。鏈接;//指針向下移動

而(p!=空)

{

cout & lt& lt"頂點" < & ltp->;vex & lt& lt" ";

p = p-& gt;接下來;

}

cout & lt& ltendl

}

返回vextotal

}

Void toposort (vexnodedig [],int n)//拓撲排序

{

edge node * p;

int i,j,k,top,m;

top = 0;

m = 0;

//cout & lt;& lt" ssss " & lt& ltn;

for(I = 1;我& lt= n;i++)

如果(挖[我]。id==0) //鏈入度為0的頂點。

{

挖[我]。id = top

top = I;

}

while(top & gt;0)

{

j =頂部;

top =挖【頂】。id;

cout & lt& ltj & lt& lt" ";//輸出入度為0的頂點。

m++;//計算零滲透的頂點。

p=dig[j]。鏈接;

而(p!=空)

{

k = p-& gt;vex

挖[k]。id-;

如果(挖[k]。id==0)

{

挖[k]。id = top

top = k;

}

p = p-& gt;接下來;

}

}

cout & lt& ltendl

如果(m & ltn)

cout & lt& lt“網絡有無環”& lt& ltendl

}

Void關鍵路徑(vexnodedig [],int n)//找到關鍵路徑。

{

//ve和vl是頂點事件的最早和最晚時間。

//e和L是活動的最早和最晚時間。

int front=0,rear = 0;

int tpord[20],vl[20],ve[20];

int l[20],e[20],I,j,k,m;

edge nodel * p;

for(I = 1;我& lt= n;i++)

ve[I]= 0;//將初始值賦給時間的最早發生時間。

for(I = 1;我& lt= n;I++) //將所有條目為0的放入團隊。

如果(挖[我]。id==0)

tpord[++ rear]= I;

m = 0;

而(前面!=後部)

{

front++;

j = tpord[front];

m++;//用於判斷是否存在有向環。

p=dig[j]。鏈接;//指針向下移動

while(p)

{

k = p-& gt;adgvex

挖[k]。id-;//頂點的穿透力減少1。

if(ve[j]+p-& gt;dut & gtVe[k]) //最早時間最大,ve[]初始為0。如果不止壹個,就比較壹下。

ve[k]= ve[j]+p-& gt;dut

如果(挖[k]。id==0)

tpord[++ rear]= k;

p = p-& gt;接下來;

}

}

如果(m & ltN) //判斷是否存在有向環。

cout & lt& lt“AOE網絡有阿昔洛韋”& lt& ltendl

for(I = 1;我& lt= n;I++) //給最晚發生時間賦壹個初始值。

VL[I]= ve[n];

for(I = n-1;我& gt=1;I-)//計算最晚發生時間。

{

j = tpord[I];

p=dig[j]。鏈接;//找到vl[]數組的值

while(p)

{

k = p-& gt;adgvex

if((VL[k]-p-& gt;dut)& lt;Vl[j]) //到最晚時間的最小值或初始值。

VL[j]= VL[k]-p-& gt;dut

p = p-& gt;接下來;

}

}

cout & lt& lt"輸出最早和最晚時間"

for(I = 1;我& lt= n;i++)

cout & lt& lt“最早的”

for(j=1,I = 1;j & lt= n;J++,i++) //計算活動的最早和最晚發生時間。

{

p=dig[j]。鏈接;

while(p)

{

k = p-& gt;adgvex

e[I]= ve[j];

l[I]= VL[k]-p-& gt;dut

cout & lt& lt"頂點" < & lt挖[j]。頂點& lt& lt"頂點" < & lt挖[k]。頂點& lt& lt“最早的”

if(l[i]==e[i])

cout & lt& lt“這是壹項關鍵活動”

其他

cout & lt& ltendl

p = p-& gt;接下來;

}

}

cout & lt& lt”關鍵路徑:“;

for(j=1,I = 1;j & lt= n;J++,i++) //計算活動的最早和最晚發生時間。

{

p=dig[j]。鏈接;

while(p)

{

k = p-& gt;adgvex

e[I]= ve[j];

l[I]= VL[k]-p-& gt;dut

if(l[i]==e[i])

cout & lt& lt挖[我]。頂點& lt& lt" ";

p = p-& gt;接下來;

}

}

cout & lt& ltn;

cout & lt& ltendl

}

測試數據

12

1 2 4

1 3 2

1 4 5

2 5 2

2 8 6

3 5 5

4 6 4

5 6 3

5 7 2

6 7 4

7 9 5

8 9 3

12

1 2

1 3

1 4

2 5

2 8

3 5

4 6

5 6

5 7

6 7

7 9

8 9

自己跑起來很容易。

妳可以問我

  • 上一篇:React作為時下最熱的前端框架,各位有什麽經驗分享下嗎
  • 下一篇:如何評價 GitHub 發布的文本編輯器 Atom
  • copyright 2024編程學習大全網