14 計算工程完成的關鍵路徑

2021-08-11 15:27:07 字數 3345 閱讀 1806

說明: aoe 網路是有向無環加權圖,其中頂點表示事件,弧表示活動,權表示活動持續的時間,通常可以用來估算工程完成的時間,即圖中從開始點到結束點之間最長的路徑對應的時間。請完成乙個程式,完成下列任務:

1 、計算 aoe 網路對應的拓撲排序。如果排序結果不唯一,請輸出按照從小到大的順序排列的結果。從小到大的順序就是輸入的節點序列順序(參見下面關於輸入格式的說明)。如圖1中滿足要求的拓撲排序是: a-b-c-d-e-f-g-h-k ,圖2中滿足要求的拓撲排序是:v1-v3-v5-v2-v6-v4-v7-v8-v9

2 、計算 aoe 網路的關鍵路徑。注意關鍵路徑可能不唯一,要求輸出所有的關鍵路徑。同樣,按照是按照從小到大的順序輸出。例,如果得到兩條關鍵路徑,分別是0-1-3-6-8-9和0-1-3-4-5-8-9,那麼先輸出後一條路徑,因為兩條路徑中前三個節點相同,而後一條路徑第四個節點的編號小。

測試用例的輸入輸出格式說明:

輸入:節點的個數,邊的條數;

各個節點的名稱序列

邊: < 起點 , 終點 , 權值 > 。說明起點和終點是在各個點在輸入序列中的位置,如圖1中邊 < a, b> 表示為 <0,1,6> 。

輸出:拓撲排序;

關鍵路徑

測試用例0是與圖1相對應的,測試用例1是與圖2相對應的。

測試用例

用例1:

輸入:9,11

a,b,c,d,e,f,g,h,k,

<0,1,6>,<0,2,4>,<0,3,5>,<1,4,1>,<2,4,1>,<4,6,8>,<4,7,7>, < 3,5,2>,<5,7,4>,<6,8,2>,<7,8,4>

輸出:a-b-c-d-e-f-g-h-k

a-b-e-h-k

用例2:

輸入:9,11

v1,v2,v3,v4,v5,v6,v7,v8,v9,

<0,4,6>,<0,2,4>,<0,5,5>,<4,1,1>,<2,1,1>,<1,6,8>,<1,7,7>,< 5,3,2>,< 3,7,4>,<6,8,2>,<7,8,4>

輸出:v1-v3-v5-v2-v6-v4-v7-v8-v9

v1-v5-v2-v8-v9

用例3:

輸入:4,4

a,b,c,d,

<0,1,2>,<1,3,3>,< 3,2,5>,<2,1,1>

輸出:not opological path

用例4:

輸入:4,5

a,b,c,d,

<0,1,1>,<1,3,1>,<0,3,2>,<0,2,1>,<2,3,1>

輸出:a-b-c-d

a-b-d

a-c-d

a-d用例5:

輸入:8,9

7a,b5,c,d11,e0,f,h,6k

<0,1,5><0,2,4><1,4,3><2,3,2><3,4,2><4,5,6><4,6,6><5,7,2><6,7,2>

輸出:7a-b5-c-d11-e0-f-h-6k

7a-b5-e0-f-6k

7a-b5-e0-h-6k

7a-c-d11-e0-f-6k

7a-c-d11-e0-h-6k

解析:感謝討論區里大佬提的醒,注意滿足ve(事件最早發生時間)=vl(事件最晚發生時間)的點,有可能不滿足拓撲排序的條件,即必須先完成某個節點的所有前驅節點才可以完成該節點。以及要注意對按題意要求的輸出順序。在鄰接表建立完後就可以直接對鄰接節點排序,可以使得多路徑的按照從小到大的順序輸出(用遞迴的輸出方法時),在拓撲排序時對棧排序可以使得排序結果不唯一的是按照從小到大的順序排列。

#include#include#include#pragma warning(disable:4996)

int nodenum, edgenum;

int topo[55], path[100];

struct link

;struct

node[50];

int cmp1(const void *p1, const void *p2)

int cmp2(const void *p1, const void *p2)

/*把頂點和邊資訊讀入到表示圖的鄰接表中*/

void creategraph()

; scanf("%s", str);

int len = strlen(str), q = 0, k = 0;

for (int i = 0; i < len; i++)

}int p = 0, k_flag = 0;

int ch_data[5], cd_p = 0;

char chs[10] = , ch;

getchar();

while ((ch = getchar()))

if (ch == ','&&k_flag == 1)

if (ch != '')

if (ch == '>'&&k_flag == 1)

}for (int i = 0; i < nodenum; i++) //先對鄰節點排序,輸出即是按順序的

qsort(node[i].linkto, node[i].linknum + 1, sizeof(node[i].linkto[0]), cmp1);

}/*廣度優先搜尋獲取拓撲序列 */

int topologicalsort_dfs()

while (top > 0)//採用廣度優先搜尋獲取拓撲序列

qsort(stack, top, sizeof(stack[0]), cmp2);//使得輸出的拓撲序列中無拓撲關係的節點要從小到大輸出,但入棧是從大到小

}free(stack);

return (count == nodenum);//如果count小於頂點數,說明存在環

}/*路徑輸出*/

void printpath(int top, int end)

for (int i = 0; i <= node[u].linknum; i++)

}}/*求關鍵路徑*/

void criticalpath()

for (int i = 0; i < nodenum; i++)

printf("\n");

for (int i = nodenum - 2; i >= 0; i--)

}path[0] = topo[0];

printpath(1, topo[nodenum - 1]);

}int main()

計算工程完成的關鍵路徑

說明 aoe 網路是有向無環加權圖,其中頂點表示事件,弧表示活動,權表示活動持續的時間,通常可以用來估算工程完成的時間,即圖中從開始點到結束點之間最長的路徑對應的時間。請完成乙個程式,完成下列任務 1 計算 aoe 網路對應的拓撲排序。如果排序結果不唯一,請輸出按照從小到大的順序排列的結果。從小到大...

H2 計算工程完成的關鍵路徑

說明 aoe 網路是有向無環加權圖,其中頂點表示事件,弧表示活動,權表示活動持續的時間,通常可以用來估算工程完成的時間,即圖中從開始點到結束點之間最長的路徑對應的時間。請完成乙個程式,完成下列任務 1 計算 aoe 網路對應的拓撲排序。如果排序結果不唯一,請輸出按照從小到大的順序排列的結果。從小到大...

關鍵路徑的計算

從源點到匯點路徑長度最長的路徑為該project的關鍵路徑,即關鍵路徑可以保證全部路徑的活動都可以完畢。ok,再次進入我們的作業題 例如以下圖所看到的的aoe網 弧上權值代表活動的持續天數 1 完畢此project最少所須要多少天?2 哪些是關鍵活動,在圖中表示出關鍵路徑 我們先計算最早發生時間ve...