圖論 筆記



圖論 筆記

有些東西不知道有什麼用...但既然dls講了就記記吧。不少東西來自國慶正睿 dls課件。
把之前的寫的合併到一篇了。
也能夠看這兒算法


度數序列

對於無向圖,\(d_1,d_2,...,d_n\)爲每一個點的度數。
\(d_1+d_2+...+d_n=2e\)(每條邊被計算兩次)。
有偶數個度數爲奇數的點。數組


Havel–Hakimi算法

給定一個由有限多個非負整數組成的度數序列,是否存在一個簡單圖使得其度數序列恰爲這個序列。
\(S=(d_1,d_2,...,d_n)\)爲有限多個非負整數組成的非遞增序列。
\(S\)可簡單圖化當且僅當有窮序列\(S’=(d_2-1,d_3-1,...,d_{d_1+1}-1,d_{d_1+2},...,d_n)\)只含有非負整數且是可簡單圖化的。
序列\(S\)可簡單圖化是指存在一個無向圖(無重邊無自環),使得其度數序列恰爲\(S\)
(這個其實就是很顯然的東西。。主要是一個定義)優化


Erdős–Gallai定理

\(S=(d_1,d_2,...,d_n)\)爲有限多個非負整數組成的非遞增序列。
\(S\)可簡單圖化當且僅當這些數字的和爲偶數,且\[\sum_{i=1}^kd_i\leq k(k-1)+\sum_{i=k+1}^n\min(d_i,k)\]編碼

對於任意\(1\leq k\leq n\)都成立。
也不難理解。對前\(k\)個點分配度數,除了兩兩能連\(\frac{k(k-1)}{2}\)條邊外,剩下的度數由後面點的度數補。
由於\(d_i\)非遞增,從小到大枚舉\(k\),維護\(d_i\)後綴與\(k\)\(\min\)的和(\(d_i,k\)都是單調的,維護從哪開始\(\min(d_i,k)\)的結果是\(d_i\))。就能夠\(O(n)\)判斷了。spa

例題:Good Bye 2018 E(居然真的遇到了),NEERC2013 K.Kids in a Friendly Class.net


歐拉路與歐拉回路

給定一張無向/有向圖,求一條通過全部邊剛好一次的迴路。
有解當且僅當全部點 度數爲偶數(無向)/入度等於出度(有向)。
任選一點開始dfs,每條邊只通過一次。回溯時將回溯的邊加入隊列,最後隊列的逆序就是答案。
時間複雜度 \(O(m)\).
歐拉路徑也能夠用同樣的方法求出(找度數爲奇數的點進行DFS)。3d

歐拉回路:有向圖:全部點的出度入度都相等;從任意一點均可實現。
     無向圖:全部點度數都爲偶數。
歐拉路:有向圖:有兩個點能夠入度出度不相等(差不大於一),即起點終點;起點入度小於出度,終點入度大於出度 。
    無向圖:僅有兩個點度數爲奇數。
注:必須爲連通圖(用並查集判斷)。
兩筆畫問題:
有解當且僅當入度爲奇數的點不超過四個。
將其中兩個點加一條邊後求歐拉路徑,而後在這條邊處斷開成兩條歐拉路便可。
時間複雜度 \(O(m)\).code

題目

UOJ.117(模板)題集htm


Prufer序列

這個很全啊,能夠看這兒
Defination:
  Prufer序列是一種無根樹的編碼表示。
  對於一棵\(n\)個點的無根樹,對應惟一一串長度爲\(n-2\)\(Prufer\)序列。

無根樹轉\(Prufer\)序列

  定義無根樹中度數爲\(1\)的節點是葉子節點,每次找到編號最小的葉節點刪除,在序列中添加與之相鄰的點。如此重複直到剩下最後兩個節點。

  上圖對應無根樹的\(Prufer\)序列爲\(3,5,1,3\)

\(Prufer\)序列轉有根樹

  給定點集\(G={1,2,\ldots,n}\)\(Prufer\)序列\([a_1,a_2,\ldots,a_{n-2}]\)
  每次取出\(Prufer\)序列中的第一個元素\(x_i\),在\(G\)中找在當前\(Prufer\)序列中沒有出現的第一個元素\(y_i\),在\(x_i\)\(y_i\)間連一條邊;將\(x_i\)\(Prufer\)序列中刪除,\(y_i\)\(G\)中刪除。
  最後\(G\)中還剩下\(2\)個元素,在這\(2\)個元素間連一條邊。

生成樹計數

Cayley定理:徹底圖的生成樹個數爲\(n^{n-2}\)
若是每一個點的度數爲\(d_i\),那麼生成樹個數爲\(\frac{(n-2)!}{(d_1-1)!(d_2-1)!...(d_n-1)!}\)
每一個連通塊大小爲\(a_i\),那麼添加一些邊將這些連通塊連通的生成樹個數爲\(a_1\times a_2\times...\times a_n\times(a_1+a_2+...+a_n)^{n-2}\)

題目

  題集


Matrix-Tree定理

  無向圖生成樹計數:\(G=D-A\)(基爾霍夫矩陣=度數矩陣-邊矩陣),而後去除\(G\)的任意一行一列獲得\(G’\)\(G’\)的行列式即生成樹個數。
  有向圖生成樹計數:與無向圖不一樣的是,\(D\)矩陣爲入度/出度矩陣分別對應外向樹/內向樹。且刪掉第\(i\)行第\(i\)列表示以\(i\)爲根節點的生成樹個數。

題目

  題集


最小生成樹 Borůvka算法

一開始每一個連通份量是一個點自己。
每輪枚舉全部屬於不一樣連通份量的邊,每一個連通份量選擇和其餘連通份量相連的最小的邊,而後合併。
每輪連通塊個數至少減半,因此最多進行\(\log V\)輪。時間複雜度\(O(E\log V)\)
具體實現直接用並查集便可。代碼能夠看這裏

題目

通常用來作邊權與點權相關,仍是個徹底圖,求MST的題?

  1. \(n\)個點的徹底圖,每一個點的權值爲\(a_i\),兩個點之間的邊權爲\((a_i+a_j)\ mod\ M\)。求這張圖的最小生成樹。
    \(N\leq10^5,0\leq M,a_i\leq10^9\)
    具體怎麼作忘了。。大家結合下面的題腦補一下。
  2. CF888G
    有一張\(n\)個點的徹底圖,每一個點的權值爲\(a_i\),兩個點之間的邊權爲\(a_i\ \text{xor}\ a_j\)。求該圖的最小生成樹。
    \(n\leq2*10^5,0\leq ai<2^{30}\)

最小瓶頸生成樹

使得生成樹樹上最大邊權值最小。
方法1:最小生成樹必定是最小瓶頸生成樹。
方法2:二分答案,看點是否連通。
方法3:
  類比找第k大值的方法(nth_element),首先隨機一個邊權\(w\)。而後將不超過這個邊權的邊加入,遍歷這張圖。
  若是圖連通,那麼瓶頸不超過\(w\),因而只需考慮邊權不超過\(w\)的邊;不然將這些連通點縮起來,考慮邊權大於\(w\)的邊。
  每次將問題的規模縮小至一半。指望時間複雜度\(T(m)=T(\frac m2)+O(m)=O(m)\)


單源最短路(SSSP)

\(Dijkstra\)(貪心)或者\(Bellman Ford\)(動態規劃)。
時間複雜度\(O(m\log n)\)或者\(O(nm)\)

一些變種

邊權是\(0/1\):雙端隊列,若是是\(0\)在頭部插入,不然在尾部插入。
最長路徑不超過\(W\), 正權圖:使用\(0...W\)的桶+鏈表維護這些點(代替堆),時間複雜度\(O(m+W)\)

關於判負環

複雜度\(O(nm)\)。代碼實現能夠記錄最短路樹上的深度來判環,而不是入隊次數,這樣會有優化。

if(dis[v]>dis[u]+w)
    dis[v]=dis[u]+w
    dep[v]=dep[u]+1
    if(dep[v]>n) return;

差分約束

大致過程:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html
考慮最短路中的鬆弛操做:if(dis[v]>dis[x]+w) dis[v]=dis[x]+w,也就是強制使得\(dis[v]\)知足\(dis[v]\leq dis[x]+w\Rightarrow dis[v]-dis[x]\leq w\)
因此對於\(x_j-x_i\leq w\)的限制,能夠連一條邊\((i\to j,w)\)。這樣求\(x_n-x_0\)的最大值,就是求\(0\to n\)的最短路。
若是限制是\(x_j-x_i\geq w\),同理連邊\((i\to j,w)\)\(x_n-x_0\)的最小值就是求\(0\to n\)的最長路。
若是兩種限制都有,就把\(\geq\)變成\(\leq\)
解的存在性:
好比求\(x_n-x_0\)的最大值:若圖中存在負環,則\(0\to n\)的最短路無窮小,則不存在最大值(無解)。
\(0\)\(n\)就不在同一連通塊,則\(0\to n\)的最短路無窮大,最大值無窮大(或者存在無數多解)。
不然有解。
PS:
\(SPFA\)能夠根據入隊次數判負環,也能夠據此判正環。雖然效率都不高就是了。
\(Dijkstra\)不能求最長路(本質是貪心)。
如何判斷解惟一:
對原圖求一遍最短路。將原圖取反,邊權取反,求一遍最長路。
一個標號對應的是能取到的最小值,一個是最大值。
若是相同則解惟一。(沒什麼用)

題目

題集


多源最短路(APSP)

\(Floyd\)\(O(n^3)\)
\(Johnson\)算法(可用於負權圖):\(O(nm\log n)\)

\(Johnson\)算法

原理:首先給圖中每一個點一個權值\(h(u)\), 把每條邊的邊權\(w(u,v)\)改爲\(w(u,v)+h(u)-h(v)\)
對於\(s\to t\)的一條路徑\(p\),權值爲

=
因此這麼作不會改變最短路。(也能夠看這兒
實現:第一次SPFA預處理\(1\)到每一個點的距離\(dis\),記\(h(v)=dis(v)\)。而後把邊權\(w(u,v)\)改成\(w(u,v)+h(u)-h(v)\)
其中\(h(u)\)爲給每一個點設定的權值,\(h(u)=dis[u]\)
由不等式能夠獲得\(dis(u)+w(u,v)\geq dis(v)\),也就是改完以後全部邊權非負。
以後能夠每一個點用\(Dijkstra\)跑。就是\(O(nm\log n)\)啦。
這樣也能夠實現\(Dijkstra\)跑費用流。


半徑 直徑 (正權圖)

(後面就直接抄dls課件了QAQ)
\(u\)的偏愛距 \(ecc(u)=\max\{dis(u,v)\}\)
直徑 \(d=\max\{ecc(u)\}\)
半徑 \(r=\min\{ecc(u)\}\ (d\neq2r)\)
中心 \(arg\ \min\{ecc(u)\}\)(要求定義在點上)
絕對中心(能夠定義在邊上)

絕對中心

相關:求最小直徑生成樹(差很少)。
實現:固定一條\((u,v)\),考慮上面的點\(p\)的偏愛距。
假設第三個點是\(w\), \(dis(p,u)=x\)
那麼對應的折線爲\(\min\{x+dis(u,w),\ w(u,v)-x+dis(v,w)\}\)
那麼偏愛距爲\(n\)條折線的最大值造成的折線。
按左端點排序維護一下。時間複雜度\(O(nm\log n)\)

最小直徑生成樹

即絕對中心的最短路樹。
如何證實?
注意一棵樹\(T\)的直徑爲半徑的兩倍(對絕對中心來講)。若是最小直徑生成樹\(T’\)不包含絕對中心,那麼取\(T’\)的絕對中心\(v\),顯然矛盾。


拓撲排序

每次去掉圖中入度爲\(0\)的點。
時間複雜度\(O(n+m)\)
若是最後不爲空集,那麼這個圖不爲DAG。(不然每一個點入度不爲0,即每一個點能夠選擇一個前趨,沿着前趨走根據抽屜原理必定能找到相同點,也就是一個環。)
按照反圖DFS,出棧序列就是一個合法的拓撲序列。
scc縮點順序也是一個合法拓撲序。

求字典序最小的拓撲序

每一個點有不一樣的標號,要使得拓撲序最小。
將拓撲排序的隊列改爲優先隊列便可。

最小拓撲序的一個變種

使得最後的拓撲序中1的位置儘可能靠前,若是相同比較2的位置,依次類推。
首先考慮如何求1最先出現的位置,能夠將原圖反向,而後每次彈除了1以外的元素,直到隊列只剩下1爲止。
這是反圖中1的最晚的出現的位置,也就是原圖中最先的。
根據是否在隊列裏,這個圖被分紅兩部分,在對應的圖中用一樣的方法處理2,依次類推。
容易發現每次找儘可能大的元素出隊,能完成上述的過程。
因此等價於反圖最大字典序。

題目

題集


二分圖匹配

Hall's marriage theorem(霍爾定理)

對於一個二分圖\(G=(X,Y,E)\),記\(S\)\(X\)的一個子集,\(N(S)\)爲全部\(S\)中全部點的相鄰點的並集。
一個圖有完備匹配當且僅當\(X\)的全部子集\(S\)都有\(|S|\leq|N(S)|\)
對通常圖的推廣:

推論: 每一個正則二分圖都有完備匹配。

Kőnig's theorem

最小點覆蓋=最大匹配 (與最大流最小割定理等價)
最大獨立集=點數-最大匹配 (獨立集爲點覆蓋的補集)
最小邊覆蓋=最大獨立集 (獨立集中每一個點須要一條邊去覆蓋)

DAG最小路徑覆蓋

覆蓋全部的邊:每條邊下界設爲1, 而後求最小流。
覆蓋全部的點:創建二分圖,對於\(u\to v\)的邊,看作二分圖中的\((u,v’)\),而後答案爲點數-最大匹配。
\(Dilworth\)定理: 最大反鏈=最小鏈覆蓋;最短的最長鏈=最小反鏈劃分數-1(?存疑。見BZOJ4160)。(固然這個不該該只放在二分圖部分的)

題目

題集


連通份量

強連通份量

\(Tarjan\)
將一個圖的全部強聯通份量縮起來會獲得一個DAG。

雙聯通份量

點連通度: 最小的點集使得刪去以後圖不連通
邊連通度: 最小的邊集使得刪去以後圖不連通
若是一個圖的點連通度大於1,那麼是點雙連通的,邊連通同理。
雙聯通份量爲圖中的極大雙聯通子圖。

割點和橋

考慮DFS樹,每條非樹邊對應着一個點到祖先的路徑。對於一條非樹邊只要把對應的邊打上標記便可。
好比對於\((u,v)\)這條非樹邊,只要在\(u\)點打上\(+1\)的標記,\(v\)點打上\(-1\)的標記。
\(x\)\(fa[x]\)的樹邊的覆蓋次數爲子樹內全部標記的和。
割點同理(注意特判根節點和葉節點)。
(沒看懂下面要幹嗎)

題目

題集


2-SAT

一堆變量的二元限制。
問是否存在合法的賦值。

題目

例題題集


曼哈頓距離與切比雪夫距離

將原座標系每一個點的座標\((x,y)\)變爲\((x+y,x-y)\),則原座標系中的曼哈頓距離等於新座標系中的切比雪夫距離。
反過來,將原座標系每一個點的座標\((x,y)\)變爲\((\frac{x+y}{2},\frac{x-y}{2})\),則原座標系中的切比雪夫距離等於新座標系中的曼哈頓距離。
例題:BZOJ3170 松鼠聚會

相關文章
相關標籤/搜索