2017華為軟體挑戰賽總結

2022-09-17 14:54:14 字數 1584 閱讀 4366

這次比賽是去年做的, 自己之前沒有總結,現在才開始總結,很多東西快想不起來了,真是慚愧

資料規模

最小費用流問題

設施選址問題,搜尋演算法zkw演算法 (演算法複雜度是多少沒有分析過) -- 最小費用可行流

連續最短路徑演算法, 弄懂spfa演算法和dijkstra演算法;

什麼是拓撲排序?

拓撲排序的實現演算法

基於dfs的拓撲排序演算法

定義 di 為點 i 的距離標號(離起點的最短路徑), 任何乙個最短路演算法保證, 演算法結束時對任意指向頂點 i 、從頂點 j 出發的邊滿足 di <= dj + cij (條件1), 且對於每個 i 存在乙個 j 使得等號成立 (條件2). 最短路徑演算法結束後, 恰在最短路上的邊滿足di = dj + cij

在最小費用流中的計算中, 我們每次沿di = dj + cij的路徑增廣後, 都不會破壞條件1, 但是可能破壞條件2, 使我們找不到每條邊都滿足di = dj + cij新的增廣路, 只好利用dijkstra, spfa等演算法重新計算新的滿足條件2的距離標號

什麼是路徑增廣?

km演算法中可以不斷修改可行頂標,不斷擴大可行子圖

什麼是km演算法?

km演算法的核心部分即控制修改可行頂標的策略使得最終可到達乙個完美匹配

什麼是匈牙利演算法?

如果找到了一條增廣路,那麼將未匹配點與匹配邊的身份調換,那麼匹配的邊數就多了一條,這樣直到找不到增廣路為止,那麼整個圖的匹配的邊數一定最大,也就是找到了二分圖的最大匹配

zkw的核心就是在始終滿足條件1的距離標號上不斷修改, 直到可以繼續增廣(滿足條件2)

初始標號為0, 不斷增廣, 如果不能增廣, 修改標號繼續增廣, 直到徹底不能增廣(源點的標號已經被加到了正無窮)

zkw的程式中, 所有的cost均表示reduced cost, 即 cij = cij - di + dj; 另外這個演算法不能直接用於有任何負權邊的圖, 更不能用於負權邊的情況

zkw演算法只需要增廣, 改標號, 不需要佇列, bfs, spfa等複雜的操作

zkw演算法的精髓在於修改頂標, 然後不斷增廣, 不能增廣了, 在看能不能修改頂標, 如果能就繼續不斷增廣, 如果不能的話就返回函式結果

實際增廣是沿最短路進行的, 時間複雜度與spfa等連續最短路演算法一致, 但節約了spfa或dijkstra的執行時間, 演算法常數很小, 速度較快

bellman-ford演算法

dijkstra的貪心演算法的本質是如下條件要成立:如果存在某條路徑p,使得p是從頂點u到v的最短路徑:

p = u->v1->v2...->vn->v, 則對於任意的1<=k<=n, 需要滿足 d(u,vk) < d(u,v)。

很顯然,這個條件要滿足的話,那麼需要圖中無負權邊才行

dijkstra和bellman-ford的區別是:

floyd演算法:

floyd演算法過程矩陣的計算----十字交叉法

伺服器選址演算法

針對v[i]之前本來是false的情況(第i號節點不是伺服器)

第三步: 遍歷伺服器集合中的所有結點, 與原來不是伺服器結點的相鄰結點進行交換(這裡的相鄰結點是指鄰接表中的相鄰, 即在圖中連線的相鄰)

輸入輸出

2017華為軟體精英挑戰賽總結

這麼久了還是想寫個部落格,其實複賽第五沒有想象中那麼遺憾,雖然那天晚上自己還是比較傷心。回想整個過程,自己的 確實沒有超哥,凱神優秀。從費用流輸掉的那個acm青島站,必須要從費用流贏回來。我到底算不算超越了自己?我覺得只是比以前勇敢了 打acm時調不出來時經常孤獨,失望。但是這次我1個多月一直堅持打...

華為軟體精英挑戰賽總結

我們的成員分工 1 負責除錯 糾錯和上傳 2 負責查詢演算法思路 3 負責查詢演算法並且寫 框架 步驟 1 通過各個同學的專長進行分工,如上所示,確定一有思路就開小組會議討論。2 3號同學在網上查詢到乙個最基本的直連程式,該程式有錯誤,需要修改。3 1號同學同過3號同學給的直連 進行除錯和改錯,與此...

華為軟體精英挑戰賽總結

賽題連線 總體來看,是乙個np hard問題。我們隊的解題思路是 1 隨機選取伺服器的位置,用遺傳演算法尋優,那麼遺傳演算法中的判斷運算元就是第二步 2 在伺服器位置固定的情況下,利用最小費用最大流演算法計算總費用。該演算法思路詳見 其中求帶負權有向圖最短路,用到了fpga演算法,其實就是b ell...