1、aov和aoe網
aov是指的用頂點(vertex)表示活動,用邊集表示活動間優先順序的有向圖,圖中不會有環。
aoe是指用帶權的邊集(edge)表示活動,用頂點表示事件的有向圖,邊權表示 完成活動所需要的時間。aoe網表示乙個工程的進行過程,它也不應該有環,一般來說它只有乙個源點(入度為零)和乙個匯入點(初度為零),其實aov網也可以轉換為aoe網。
aoe網著重解決的問題有:①工程從開始到結束需要多少時間②工程中哪些分工程是影響全域性的。一般來說 第二個問題會轉換到最長路徑。
2、最長路徑
和我們在之前看過的最短路徑不同,最長路徑,一般代表的是那種不能拖延的工程,如何求最長路徑呢?
將所有權值變負,然後用ford演算法算出最小的那個,然後再變正就是了。
3、關鍵路徑
aoe網實際上屬於有向無環圖,下面給出乙個求解有向無環圖中最長路徑的方法
首先設定兩組陣列,e和l,第乙個表示最早開始的時間,第二個表示最遲開始的時間,如果e==l,則說明這個活動是不能拖延的 ,即為我們所求的關鍵路徑。然後問題來了,怎麼求e和l呢?
①對於乙個活動,在上乙個事件最早發生時開始則會得到最早開始時間,e=ve;
②對於乙個事件,他的最遲發生時間就是上個活動最遲開始時間加上路的權值,即 vl=l+w;
然後對於我們的難題就轉移到求端點的最早開始和最晚開始時間
假設有k個事件,通過相應的活動到達事件j,假設我們已經得到了每個事件的最早發生時間ve,那麼vj最早發生時間就是各個事件ve+w中的最大值,因為只有所有事件都發生且經過活動到達之後,j才會被啟用,所以想要獲得ve[j]的正確值,ve[v1]~ve[vk]必須全部都到手,通過拓撲排序就可以保證其前驅端點都訪問完畢了,但是不可能通過j去拓撲他的前驅端點,因此可以在訪問他的前驅端點是,就不斷地更新ve[j]。
if(ve[u]+g[u][i].w>ve[j])
同理,若獲得vj,那麼1~k的最晚發生時間也可以確定,這時需要保證他的後繼結點都已經被訪問完bool topol()//判斷是否非環
} }if(toporder.size()!=n) return false;
else return true;
}int criticalpath()
fill(vl,vl+n,ve[n-1]);
while(!toporder.empty())
}} return ve[n-1];
}
C STL在演算法題中的應用 持續更新
寫洛谷的題,有時候不會總是會去看題解,有的思路很巧妙,需要學習,有的用了很厲害的stl,之前一直在看,現在想想也是要記下來好一點。這個帖子持續更新吧,再見到好用的stl就在這裡記下來 1.vector,是個容器很好用,但是我基本沒怎麼用過 2.string.find first not of 0 找...
分治演算法在一般選擇問題中的應用
下面有乙個要求就是在乙個陣列中選取第i小的元素,怎麼辦?直接排序?然後再輸出結果?當然這是一種解決方法,但是效率很低,演算法導論中給出了乙個比較經典的解決方法 其過程與快速排序過程中劃分類似。每次劃分集合可以確定乙個元素的最終位置,根據這個位置可以判斷是否是我們要求的第i小的元素。如果不是,那麼我們...
catalan數在筆試題中的應用
令h 0 1,h 1 1,catalan數滿足遞推式 1 h n h 0 h n 1 h 1 h n 2 h n 1 h 0 n 2 例如 h 2 h 0 h 1 h 1 h 0 1 1 1 1 2 h 3 h 0 h 2 h 1 h 1 h 2 h 0 1 2 1 1 2 1 5 另類遞推式 2 ...