图论复习——dfs树,点双,边双,强连通分量
知識點
dfs樹
對一個圖運行 dfs 算法,每個點uuu的父親定義為第一次遍歷uuu時的前驅結點,若無則為根。
無向圖的 dfs樹 沒有橫叉邊。
有向圖的 dfs樹 橫叉邊方向唯一,總是從后訪問的點指向先訪問的點。
dfs樹詳解
tarjan
點雙
定義:
不存在割點的圖。
性質:
兩點一線型點雙,較為特殊,以下在討論特定性質時可能不納入考慮范圍。
表述2:點雙(兩點一線型除外)中任意兩點間都存在至少兩條簡單路徑,并且這兩條路徑不經過相同的點。
表述3:點雙(兩點一線型除外)中任意兩條邊至少包含在一個簡單環(huán)內。
(對于點雙中的任意一對點,連接它們的簡單路徑所經過點的并集一定就是這個點雙本身。)
圓方樹
圓方樹是根據點雙把無向圖縮點所形成的樹。
我們把每一個點雙縮成一個 “方點”,把原有的點稱作 “圓點”。然后我們把原圖的邊全部刪除,讓每個點向其所屬的點雙的 “方點” 連邊。
顯然,一個割點會向多個方點連邊,而由此,除了根節(jié)點以外,所有的非割點都是葉子節(jié)點。 我們也知道,圓點和圓點之間不會互相連邊,方點和方點之間也不會互相連邊。
(第一個是原圖,第三個是原圖對應的圓方樹)
應用:
- 處理有關簡單路徑的問題
- 處理有關圖的連通性的問題
- %%%大佬的Blog
邊雙
定義:
不存在橋的圖。
性質:
表述2:邊雙中任意兩點間都存在至少兩條簡單路徑,并且這兩條路徑不經過相同的邊。
(由兩個點雙組成的邊雙)
小小總結:
點雙和邊雙都是 由一些簡單環(huán)組成的無向連通圖,
不嚴謹?shù)卣f,點雙是"邊的集合",邊雙是"點的集合"。
圖上的簡單路徑問題,一般用圓方樹(點雙)解決。
強連通分量
定義:
若有向圖GGG滿足:圖中任意兩點u,vu,vu,v間都存在從uuu到vvv的有向路徑和從vvv到uuu的有向路徑,則稱GGG是一個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。
性質:
Kosaraju 算法
SAT & 2-SAT
入門講解
入門講解
題目
POJ2942 Knights of the Round Table
題意:判斷每個點是否能在奇環(huán)內。
題解:若點在一個奇環(huán)內,則這個環(huán)一定在點所在的點雙內,而點雙中只要存在一個奇環(huán),點雙中的所有點都可以在奇環(huán)上。奇環(huán)的判斷:二分圖染色后,只要有一個點和它的相鄰節(jié)點的顏色相同,就找到了奇環(huán)。
Code
AGC038D Unique Path
%%%zjr學長
摘自此Blog
XSY3273 graph
題意:有一個無向圖,它沒有重邊和自環(huán)。現(xiàn)在有一些詢問,形如“u,vu,vu,v之間是否存在一條長度為奇數(shù)的簡單路徑?” 這里簡單路徑定義為不經過重復的點的路徑。
題解:首先建出dfs樹,然后判斷u,vu,vu,v間的樹上路徑長度是否為奇數(shù)
不是奇數(shù)的話考慮原圖的圓方樹,因為任意兩點間的簡單路徑都可以拆分成經過的點雙,所以就有以下結論:
對于樹上距離為偶數(shù)的u,vu,vu,v,它們之間存在長度為奇數(shù)的簡單路徑當且僅當它們的樹上路徑經過了至少一條在奇環(huán)上的邊
所以只需要求樹上路徑是否經過這樣的邊,每找到一個奇環(huán),這個奇環(huán)所在的點雙所包含的邊都是滿足要求的邊,tarjan預處理即可
Code
HDU2767 Proving Equivalences
如果這個圖本身就是強連通的,不用加任何邊。
否則把每個強連通分量縮成一個點,得到一個DAGDAGDAG。記in[i]in[i]in[i]為點iii的入度,out[i]out[i]out[i]為點iii的出度,那么DAGDAGDAG上的點可以分為以下四類:
貪心策略:第3類點向第2,4類點連邊,第4類點再向第2類點連邊
所以令DAGDAGDAG變?yōu)閺娺B通,加的最少邊數(shù)為max(入度為0的點數(shù),出度為0的點數(shù))max(入度為0的點數(shù),出度為0的點數(shù))max(入度為0的點數(shù),出度為0的點數(shù))
POJ3177 Redundant Paths G
題解:
把邊雙縮成點。
tarjantarjantarjan縮點后圖變成樹,首先特判樹中點數(shù)n≤2n\leq 2n≤2的情況。
考慮n>2n>2n>2的情況,答案為?cntleaf+12?\lfloor\frac{cnt_{leaf}+1}{2}\rfloor?2cntleaf?+1??。
構造具體方案時,以任意度大于111的點為根,只需要保證任意兩個葉子連邊后與根成環(huán),
當奇數(shù)個葉子時,可以將一個葉子與根相連,又轉換成了偶數(shù)葉子情況。
具體構造:
tarjantarjantarjan縮點后圖變成樹,選擇度數(shù)大于111的點為根,按照dfsdfsdfs序存下所有葉子,leaf[i]leaf[i]leaf[i]表示按dfsdfsdfs序排序后的第iii個葉子,共ggg個葉子。
將leaf[i]leaf[i]leaf[i]與leaf[i+?g2?]leaf[i+\lfloor\frac{g}{2}\rfloor]leaf[i+?2g??]連邊,(i≤?g+12?i\leq \lfloor\frac{g+1}{2}\rfloori≤?2g+1??)。
構造方法證明:
見2020牛客多校第三場C
CF1000E We Need More Bosses
“必須經過的邊”就是sss到ttt路徑上的割邊,把無向圖中的邊雙縮成點,得到一棵樹,求樹的直徑即可。
Code
CF1137C Museums Tour
d≤50d\leq 50d≤50
摘自此Blog
Code
CF1220E Tourism
在邊雙內走,一定能回到原點,故把邊雙縮成點。
然后就是樹形DP:
f[cur]f[cur]f[cur]代表走到curcurcur子樹還能回的貢獻,g[cur]g[cur]g[cur]代表走到curcurcur子樹回不來的貢獻,題目所求即為g[s]g[s]g[s]。
先考慮fff的轉移, 如果子節(jié)點能回來:f[cur]+=f[to]f[cur]+=f[to]f[cur]+=f[to]
然后g[cur]=max(g[to])+f[cur]g[cur] = max(g[to]) + f[cur]g[cur]=max(g[to])+f[cur](走完所有可以返回的兒子再找個最大的不能返回的)
這樣有一個問題,如果f[cur]<g[cur]f[cur]<g[cur]f[cur]<g[cur],結點curcurcur是否要返回
于是再:g[cur]=max(g[cur],f[cur]?f[to]+g[to])g[cur] = max(g[cur], f[cur] - f[to] + g[to])g[cur]=max(g[cur],f[cur]?f[to]+g[to])
摘自此Blog
Code
CF732F Tourist Reform
Blog
Code
POJ3694 Network
題意:在線查詢一個無向圖加入一條邊后減少了多少條橋。
題解:先將所有的邊雙縮點,得到一顆樹。初始時橋數(shù)即為樹的邊數(shù),樹邊邊權皆為1。
每次詢問加入邊(x,y)(x,y)(x,y),設c[i]c[i]c[i]表示點iii所在邊雙。
若c[x]==c[y]c[x]==c[y]c[x]==c[y],無影響。
否則,減去的橋數(shù)為樹上c[x]c[x]c[x]到c[y]c[y]c[y]的路徑上邊權的和,然后把該路徑上樹邊的邊權全部改為0。
[HNOI2012]礦場搭建
摘自此Blog
總結
以上是生活随笔為你收集整理的图论复习——dfs树,点双,边双,强连通分量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑三电脑配置要求2022(剑三 电脑配置
- 下一篇: [集训队作业2018] count(笛卡