/*
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 ...