圖論刷題日記

寫在前面

關於圖論,大概包括這些算法

圖的存儲
DFS(圖論)
BFS(圖論)
樹上問題
矩陣樹定理
有向無環圖
拓撲排序
最小生成樹
斯坦納樹
最小樹形圖
最小直徑生成樹
最短路
拆點
差分約束
k 短路
同餘最短路
連通性相關
2-SAT
歐拉圖
哈密頓圖
二分圖
最小環
平面圖
圖的着色
網絡流
Prufer 序列
LGV 引理
弦圖網絡

次小生成樹(非嚴格,kruscal板)

經過這個圖咱們能夠看到的是,咱們須要在原有的最小生成樹的基礎上,在另外找一個邊,使其變成次小生成樹優化

首先咱們能夠跑一邊 \(kruscal\) 將最小生成樹創建出來,並設置一個 \(big[i][j]\) 表示 \(i\)\(j\) 的路徑上的最大權值,咱們能夠經過沒有在最小生成樹上的邊來與最小生成樹上的邊進行比較,能夠得出公式spa

\[ans=min(ans,sml_{tree}+w-big_{i,j} \]

其中 \(sml_{tree}\) 爲最小生成樹樹的總權值,\(w\) 爲當前不在最小生成樹上的邊3d

本筆記主要是記錄本身的刷題的歷程以及中心思路,對知識點的講解會不時更新blog

當圖中存在惟一的最小生成樹時改算法適用,不然求出來的值不變,僅僅爲另一個次小生成樹排序

模板代碼字符串

\(spfa\)\(dfs\)優化+判負環

\(spfa\)\(dfs\) 優化經過以一個點爲開頭,經過鬆弛操做不斷迭代,直到找到找到一個曾經被找過的點時,便可找到一個環get

\(spfa\)\(dfs\) 優化能夠經過二分和公式推論(找鬆弛條件)來達到求最值的問題,解決了查找時沒法準確記錄權值的問題數學

對於找負環,能夠有兩種作法,一是經過 \(dfs\) 優化來判斷是否有負環,二是能夠經過一個點入隊的次數\(\ge n\) 來判斷

相對於 \(dfs\) 優化找負環,判斷入隊次數更加的穩定,且不容易被刻意的樣例卡掉

帶優化的判入隊次數\(spfa\)判負環模板

\(spfa\)\(dfs\)優化二分模板

\(spfa\)\(dfs\)優化判負環模板

例題

一、黑暗城堡

思路
  • 對於點的數據範圍 \(n\le 10^3\),考慮用鄰接矩陣進行解答,更加簡單

  • 該題首先給出全部的道路修建的可能性邊,求解 $ m $ 條邊所有建完時 \((1,i)\) 的最短路 \(D_i\),和實際狀況下建好的邊所造成的圖中 \((1,i)\) 的最短路 \(S_i\) 相等的建設方案數,並對 \(2^{31}-1\)取摸便可

  • 須要注意的是最好開 \(long long\)

  • 首先在存圖的時候作一個操做,由於是雙向圖,全部正反存這個沒有問題,其次就是可能會出現重複的邊的狀況,那麼對於徹底建好的圖的最短路,重複的邊中不是最小邊的全部邊沒有貢獻,全部建邊的時候對邊的權值取一個 \(min\) 便可

  • 其次經過鄰接矩陣版的\(dj\)求出從全部的 \((1,i)\)的最短路

  • 最後根據乘法原理判斷就能夠了,乘法技術原理能夠參考組合數學第一節OVO。

代碼

Here

二、北極通信網絡

思路
  • 思路很簡單,首先枚舉一遍全部的距離,並用最小生成樹的方法進行升序排列,從最小的距離開始一一枚舉。

  • 由於無線電在兩個村莊中只須要建造一個,因此所設置的 \(cnt\) 爲可能一共能夠設置的數量

  • 按照村莊之間能夠間接或者直接的鏈接能夠得出來,用並查集來作便可

  • 每次發現沒有能夠直接或者間接的鏈接的村莊就記錄一下距離,直到記錄到 \(cnt=\)能夠設置的衛星的數量時中止,此時記錄的就是最小的答案值

代碼

Here

三、新的開始

思路
  • 惟一的一個坑點就是誤覺得電站只能建造一個=_=

  • 其實能夠將 \(0\) 點看作電站的來源點,將全部點與 \(0\) 點鏈接,權值爲在該點建造電站的費用

  • 其餘的電網用邊鏈接起來

  • 跑最小生成樹便可

代碼

Here

四、構造徹底圖

思路
  • 經過手模樣例能夠發現,從最小的權值向最大的權值連邊的限制就會愈來愈小

  • 因此就跑一邊最小生成樹,從小向大的依次累加便可

  • 每一次求邊的時候只須要 \(+\) 當前的權值 \(+1\)

代碼

Here

五、祕密的牛奶運輸

見非嚴格次小生成樹

六、最小生成樹計數

思路
  • 首先有一個萬古不變的真理:一個圖中的最小生成樹,無論怎麼改變邊,一個的權值的邊的數量在最小生成樹中是固定不變的

  • 那麼根據這個來開始找就好了

  • 首先創建一棵最小生成樹,並按照邊權升序排列,隨後就把每一種邊權的左右端點都找出來,\(dfs\)一遍找一找有多少知足的邊便可,用乘法原理計算答案

代碼

Here

七、\(Word Rings\)

思路
  • 這個題目能夠經過一個隨隨便便的哈希把每一個字符串的前兩個字母和後兩個字母轉換數字來連邊,每個字符串的開頭兩個字母和結尾兩個字母連一條\(w=len_s\)的邊

  • 由於是讓咱們進行找環,而且要找出平均長度最大的環,那麼能夠考慮二分一下\(ans\)

\[ans=\frac{w_1+w_2+w_3+……+w_k}{k} \]

\[ans \times k=w_1+w_2+w_3+……+w_k \]

\[(w_1+w_2+w_3+w_4+……+w_k)-ans\times k=0 \]

那麼二分紅立的條件便可爲:

\[(w_1-ans)+(w_2-ans)+(w_3-ans)+(w_4-ans)+……+(w_k-ans)\ge 0 \]

代碼

Here

八、雙調路徑

思路
  • \(dp\) 竟在圖論中???

  • 首先能夠設置狀態

\(dis[i][j]\) 爲一共通過 \(j\) 的距離到達 \(i\) 點所用的最小時間

  • 求得轉移方程(假設當前節點\(u\),走到的距離爲\(w\),鏈接點\(v\)的長度爲 \(val\),走這條路所需時間爲 \(time\) )

\[dis[v][w+val]=min(dis[u][w]+time) \]

  • 最後以距離爲第一關鍵字, 時間爲第二關鍵字來找個數,注意最短路徑是指路程或者時間更小的路徑
代碼

Here

相關文章
相關標籤/搜索