sdut AOE網上的關鍵路徑 spfa 前向星

2022-02-20 03:42:03 字數 1908 閱讀 9269

乙個無環的有向圖稱為無環圖(directed acyclic graph),簡稱dag圖。

aoe(activity on edge)網:顧名思義,用邊表示活動的網,當然它也是dag。與aov不同,活動都表示在了邊上,如下圖所示:

如上所示,共有11項活動(11條邊),9個事件(9個頂點)。整個工程只有乙個開始點和乙個完成點。即只有乙個入度為零的點(源點)和只有乙個出度為零的點(匯點)。

關鍵路徑:是從開始點到完成點的最長路徑的長度。路徑的長度是邊上活動耗費的時間。如上圖所示,1 到2 到 5到7到9是關鍵路徑(關鍵路徑不止一條,請輸出字典序最小的),權值的和為18。

這裡有多組資料,保證不超過10組,保證只有乙個源點和匯點。輸入乙個頂點數n(2<=n<=10000),邊數m(1<=m <=50000),接下來m行,輸入起點sv,終點ev,權值w(1<=sv,ev<=n,sv != ev,1<=w <=20)。資料保證圖連通。

關鍵路徑的權值和,並且從源點輸出關鍵路徑上的路徑(如果有多條,請輸出字典序最小的)。

9 11

1 2 6

1 3 4

1 4 5

2 5 1

3 5 1

4 6 2

5 7 9

5 8 7

6 8 4

8 9 4

7 9 2

18

1 22 5

5 77 9

題目分析:

由題意可以知道這是要求從起點s到終點e的最長路徑,因為有10000個點,有50000條邊,用spfa進行最短路,但是有乙個問題就是要求路徑的字典序最小。

如果正向建圖的話,

比如下圖:如果現在終點是6,現在2和3都能使6的距離達到最大且值相同。我們處理的時候會選2,但還是2這條路徑卻不是最優的,反而3是最優的。

所以我們逆向見圖,求乙個最短路然後倒著輸出就好了。

解決方式:

倒序建圖,當鬆弛時(u,v),遇到相同的情況,盡量使u變的更小,那麼最終得到就是最小的字典序。

對於求最長路徑,將dis設為-inf,dis[s] = 0 

#include #include 

#include

#include

#include

#define inf 0x3f3f3f3f

#define maxx 200001

using

namespace

std;

struct

node

eg[maxx];

int n,m,flag,tt,pre[20002],ru[20002],ch[20002],dis[20002],v[20002],head[20002

];void

init()

void add(int xx,int yy,int

zz)void spfa(int s,int

e) dis[s]=0

; q.push(s);

while(!q.empty())

}else

if(dis[ff]+w==dis[vv]&&pre[vv]>ff)}}

}cout

int t=e;

while(t!=s)

}int

main()

for(int i=1; i<=n; i++)

spfa(ru,ch);

}return0;

}

SDUT AOE網上的關鍵路徑(SPFA)

spfa沒有用貪心去找出最優的邊去優化 全部進行鬆弛一遍 有點可以檢測負環 關鍵是 鄰接表打發簡單 區別 不再是vis標記是否訪問過 而是用乙個inque陣列 來判斷是否入隊 注意反向建圖 資料水預設1為源點n為終點 includeusing namespace std define inf 0x3...

AOE網上的關鍵路徑

求關鍵路徑 1 輸入e條弧,建立aoe 網的儲存結構 2 從源點v0出發,令ve 0 0,按拓撲有序求其各頂點的最早發生時間ve i 1 i n 1 如果得到的拓撲有序序列中頂點個數小於頂點數n,則說明網中存在環,不能求關鍵路徑,演算法終止 否則執行步驟 3 3 從匯點vn出發,令vl n 1 ve...

AOE網上的關鍵路徑

time limit 1000ms memory limit 65536k 乙個無環的有向圖稱為無環圖 directed acyclic graph 簡稱 dag圖。aoe activity on edge 網 顧名思義,用邊表示活動的網,當然它也是dag。與aov不同,活動都表示在了邊上,如下圖所...