日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图论复习——dfs树,点双,边双,强连通分量

發(fā)布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图论复习——dfs树,点双,边双,强连通分量 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

知識點

dfs樹

對一個圖運行 dfs 算法,每個點uuu的父親定義為第一次遍歷uuu時的前驅結點,若無則為根。
無向圖的 dfs樹 沒有橫叉邊。
有向圖的 dfs樹 橫叉邊方向唯一,總是從后訪問的點指向先訪問的點。
dfs樹詳解

tarjan

點雙

定義:

不存在割點的圖。

性質:


兩點一線型點雙,較為特殊,以下在討論特定性質時可能不納入考慮范圍。

  • 點雙的dfs樹上,根只有一個兒子,除葉子和根外每個點都有回邊跨過。
  • 表述1:點雙(兩點一線型除外)中任意兩點至少包含在一個簡單環(huán)內。
    表述2:點雙(兩點一線型除外)中任意兩點間都存在至少兩條簡單路徑,并且這兩條路徑不經過相同的點。
    表述3:點雙(兩點一線型除外)中任意兩條邊至少包含在一個簡單環(huán)內。
  • 對于點雙中任意兩點u,vu,vu,v,若點ppp在點雙中,則一定存在u?p?vu-p-vu?p?v的簡單路徑;若點ppp不在點雙中,則一定不存在u?p?vu-p-vu?p?v的簡單路徑。
    (對于點雙中的任意一對點,連接它們的簡單路徑所經過點的并集一定就是這個點雙本身。)
  • 對于點雙中任意兩點u,vu,vu,v,若邊ppp在點雙中,則一定存在u?p?vu-p-vu?p?v的簡單路徑。
  • 若點雙中有奇環(huán),由3.4.得任意兩點間的簡單路徑有偶數(shù)長度和奇數(shù)長度的,所以點雙里的所有邊和點都在奇環(huán)上。
  • 一個有割點的無向圖可以由若干個點雙組成,點雙間以割點相連接,兩相鄰的點雙之間的公共點一定是唯一的,且一定是割點。
  • 無向圖中的每個割點至少屬于兩個點雙,其余點和每條邊都只屬于一個點雙。
  • 點雙連通分量一定是邊雙連通分量(兩點一線型除外),反之不一定。
  • 圓方樹

    圓方樹是根據點雙把無向圖縮點所形成的樹。
    我們把每一個點雙縮成一個 “方點”,把原有的點稱作 “圓點”。然后我們把原圖的邊全部刪除,讓每個點向其所屬的點雙的 “方點” 連邊。
    顯然,一個割點會向多個方點連邊,而由此,除了根節(jié)點以外,所有的非割點都是葉子節(jié)點。 我們也知道,圓點和圓點之間不會互相連邊,方點和方點之間也不會互相連邊。

    (第一個是原圖,第三個是原圖對應的圓方樹)

    應用:

    • 處理有關簡單路徑的問題
    • 處理有關圖的連通性的問題
    • %%%大佬的Blog

    邊雙

    定義:

    不存在橋的圖。

    性質:

  • 邊雙的dfs樹上,每條樹邊都有回邊跨過。
  • 表述1:邊雙中任意一條邊都包含在至少一個簡單環(huán)中。
    表述2:邊雙中任意兩點間都存在至少兩條簡單路徑,并且這兩條路徑不經過相同的邊。
  • 不是點雙的邊雙可以由點雙組成。

    (由兩個點雙組成的邊雙)
  • 在一個有割邊的無向圖中,把每一個邊雙縮成一個點,然后這些點之間由原來的割邊相連形成了一棵樹。
  • 無向圖中兩點一線型點雙的邊其實就是割邊,割邊不屬于任何邊雙,而其它非割邊的邊都屬于且僅屬于一個邊雙。
  • 小小總結:

    點雙和邊雙都是 由一些簡單環(huán)組成的無向連通圖,
    不嚴謹?shù)卣f,點雙是"邊的集合",邊雙是"點的集合"。
    圖上的簡單路徑問題,一般用圓方樹(點雙)解決。

    強連通分量

    定義:

    若有向圖GGG滿足:圖中任意兩點u,vu,vu,v間都存在從uuuvvv的有向路徑和從vvvuuu的有向路徑,則稱GGG是一個強連通圖。有向圖的極大強連通子圖,稱為強連通分量

    性質:

  • 在強連通圖中,每個點的入度和出度一定都不為0。
  • 把有向圖中的每個強連通分量縮成一個點,將得到一個DAGDAGDAG(有向無環(huán)圖)。
  • 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上的點可以分為以下四類:

  • in[i]>0,out[i]>0in[i]>0,out[i]>0in[i]>0,out[i]>0
  • in[i]=0,out[i]>0in[i]=0,out[i]>0in[i]=0,out[i]>0
  • in[i]>0,out[i]=0in[i]>0,out[i]=0in[i]>0,out[i]=0
  • in[i]=0,out[i]=0in[i]=0,out[i]=0in[i]=0,out[i]=0
  • 貪心策略:第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 2n2的情況。
    考慮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


    “必須經過的邊”就是sssttt路徑上的割邊,把無向圖中的邊雙縮成點,得到一棵樹,求樹的直徑即可。

    Code

    CF1137C Museums Tour


    d≤50d\leq 50d50

    摘自此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树,点双,边双,强连通分量的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。