拓撲排序之關鍵路徑

2021-06-27 02:04:13 字數 2442 閱讀 7348

/*

name: 拓撲排序之關鍵路徑 

author: 巧若拙 

date: 17-11-14 21:02

description: 拓撲排序之關鍵路徑 

若在帶權的有向圖中,以頂點表示事件,以有向邊表示活動,邊上的權值表示活動的開銷(如該活動持續時間),

則此帶權的有向圖稱為邊表示活動的網 (activity on edge network) ,簡稱 aoe 網。

(1)aov 網具有的性質 

⒈ 只有在某頂點所代表的事件發生後,從該頂點出發的各有向邊所代表的活動才能開始。

⒉ 只有在進入某一頂點的各有向邊所代表的活動都已經結束,該頂點所代表的事件才能發生。 

⒊ 表示實際工程計畫的 aoe 網應該是無環的,並且存在唯一的入度過為 0 的開始頂點和唯一的出度為 0 的完成頂點。

(2)由事件 v j 的最早發生時間和最晚發生時間的定義 , 可以採取如下步驟求得關鍵活動 : 

1. 從開始頂點 v 1 出發 , 令 ve(1)=0, 按拓樸有序序列求其餘各頂點的可能最早發生時間。 

ve(k)=max ( 7.1 ) 

j ∈ t 

其中 t 是以頂點 v k 為尾的所有弧的頭頂點的集合 (2 ≤ k ≤ n) 。 

如果得到的拓樸有序序列中頂點的個數小於網中頂點個數 n ,則說明網中有環,不能求出關鍵路徑,演算法結束。 

2. 從完成頂點 v n 出發,令 vl(n)=ve(n) ,按逆拓樸序列求其餘各頂點的允許的最晚發生時間 : 

vl(j)=min 

k ∈ s 

其中 s 是以頂點 v j 是頭的所有弧的尾頂點集合 (1 ≤ j ≤ n-1) 。 

3. 求每一項活動 a i (1 ≤ i ≤ m) 的最早開始時間 e(i)=ve(j) ;最晚開始時間 

l(i)=vl(k)-dut() 

。若某條弧滿足 e(i)=l(i) ,則它是關鍵活動。

輸入:第一行兩個整數n,m分別表示頂點個數和邊的條數,其中頂點的編號為0~n-1。

接下來的m行,每行有三個數u,v,w,表示從弧尾u到弧頭v的邊的權值w。

8 90 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

輸出:輸出所有關鍵路徑,每行輸出乙個關鍵路徑。格式如下:

0->2->3->4->5->7

0->2->3->4->6->7

0->1->4->5->7

0->1->4->6->7

演算法分析:

採用廣度優先搜尋進行拓撲排序,獲取拓撲序列的同時計算各頂點事件的最早發生時間,然後逆序計算各頂點事件的最晚發生時間。

本文是《大話資料結構》的讀書筆記,但演算法實現與《大話資料結構》完全不同,自我感覺比書上的演算法要簡潔,哈哈! 

*/#include

#include

#define maxn 26   //最大頂點數量 

#define maxm 100000   //最大邊數量 

typedef char vertextype; //頂點型別由使用者自定義

typedef int edgetype; //邊上的權值型別由使用者自定義

typedef struct edge edgelib;

void printgraph(int first, edgelib edge, int n);//輸出圖

int topologicalsort(int topo, int etv, edgelib edge, int in, int first, int n);

void criticalpath(edgelib edge, int in, int first, int n);//求關鍵路徑 

void printpath(edgelib edge, int first, int etv, int ltv, int path, int top, int end);//深度優先搜尋輸出關鍵路徑 

int main()

printf("\n");

}printf("\n");

} int topologicalsort(int topo, int etv, edgelib edge, int in, int first, int n)

}path[0] = topo[0];

printpath(edge, first, etv, ltv, path, 1, topo[n-1]); 

}void printpath(edgelib edge, int first, int etv, int ltv, int path, int top, int end)//深度優先搜尋輸出關鍵路徑 

printf("\n");

return;

}for (i=first[u]; i!=-1; i=edge[i].next) }

}

拓撲排序,關鍵路徑

拓撲排序 對於乙個流程圖,可以用頂點表示活動,弧表示活動間的優先關係,這樣所表示的有向圖稱為頂點表示活動的網,即aov網。在網中,如果頂點i到頂點j有一條有向路徑,或者 i,j 是一條弧,則i是j的前驅,j是i的後繼。aov網中不應該出現環。拓撲排序的思想很簡單,1 在有向圖中選乙個沒有前驅的頂點輸...

拓撲排序 關鍵路徑

功能function description hdoj 2094 開發環境environment dev c 4.9.9.1 技術特點technique 版本version 作者author 可笑痴狂 日期date 20120812 備註notes 策略問題 一 本來想先用字典樹給名字編號,然後用建...

關鍵路徑(拓撲排序)

一.先給出幾個概念 aoe 網 在帶權有向圖中頂點表示事物,有向邊表示活動,權表示活動持續的時間,則此有向圖稱為邊表示活動的網路。activity on edge network 表示實際工程的aoe 網應該是無環的,且存在唯一入度為0的起始頂點 始點 以及唯一出度為0的完成頂點 終點 利用aoe ...