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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

tarjan求强连通分量的思考

發布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tarjan求强连通分量的思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我是按照這里的思路來的。這個博文只是感性理解。

遞歸樹

關于遞歸樹,這篇博文講的很好,我只是給自己總結一下。

定義vis數組,在dfs連通圖時賦予它們不同的含義:

  • vis=0,表示這個點沒有被訪問。
  • vis=1,表示這個點被訪問了,但是它的孩子還沒有訪問完。
  • vis=2,表示這個點被訪問了,并且它的孩子訪問完了。
  • 一個連通圖,一定可以表示成一個遞歸樹,加上一些邊。這些邊的種類有:

  • 樹邊,也就是遞歸樹上的邊。表現為訪問(u, v)時,\(vis[v]=0\)
  • 回邊,是一個點連向它遞歸樹上的祖宗的邊。表現為\(vis[v]=1\)
  • 前向邊,是一個點連向它遞歸樹上的子孫后代的邊。表現為\(vis[v]=2\)
  • 橫邊,是一個除了前三種邊以外的邊,也就是說u和v沒有什么祖宗關系。表現為\(vis[v]=2\)
  • 一個強連通的東西,必定在一棵遞歸樹上,不會分散到多個上。不然那東西就不連通了,想要強連通更是不可能。

    對了,如果將dfs訪問到的時間,給遞歸樹上的點編號,一個點的祖先的編號一定比這個點小。

    tarjan搞一次出棧的一定是一個強連通的東西

    還記得tarjan里,判斷一個點是否出棧的依據嗎?就是\(dfn[u]=low[u]\)。這意味著在u的子結點中,沒有回往u以上的邊,不然\(low[u]<dfn[u]\)。所以根據tarjan算法,如果u出棧,出棧的東西中編號最小的就是u。出棧的東西應該類似于這樣(沒畫有向邊,所以腦補吧):

    也就是說,一個節點只有間接連向u,才能和u組成一個強連通的東西。這導致強連通分量在遞歸樹上,其實就是一堆鏈的集合體,也就是樹。

    重點來了。如果tarjan搞出來的東西中,有一些點不和其它點強連通,說明它不能間接連向u,而是會間接連向u的一個兒子v。如果\(low[v]<dfn[v]\),這個點又可以間接連向\(low[v]\)...,以此類推,最終連向一個可以出棧的點,那個點u的是兒子。這就證明了,一次出棧搞出來的東西,和u都是強連通的。

    tajan一次搞出來的,一定是一個強連通分量

    這個標題和前面哪一個的區別是什么呢?就是一個是“東西”,一個是“分量”。分量意味著它大的不能再大了。所以這里要證明(彌天大霧,其實我這個根本不算證明)的,就是一次tarjan搞出來的,最小結點為u的強連通分量中,不會有其它點被遺漏。至于這個證明,我貼一個引用過來:

    假設出棧的部分不完整,則本應該在這次出棧的點可能存在于棧的哪些部分呢?
    1.之前出棧的部分
    2.還沒有入棧的部分
    3.還沒有出棧的部分
    首先看2,不可能。因為假如沒有入棧,說明這些點沒有在這棵深度優先搜索樹中,假如這些點在本該在該強連通分量中,則和定理1相違背,所以情況2中不可能包含本應該出棧的強連通分量中的點。再看3,也不可能。3中的點的dfn 和 low都分別小于本次出棧的點的dfn和low,也就說明本次出棧的點都無法訪問到還沒有出棧的點,所以情況3中不可能包含本應該出棧的強連通分量中的點。最后看情況1,其實情況1和情況3是類似的,之前出棧的部分A如果和本次出棧的強連通分量B可以組成更大的強連通分量,這就等價于,以之前出棧的強連通分量A為視角,亦是說A是不完整的,A中缺少的部分在還未出棧的節點和還沒有訪問的節點之中。這和之前的情況2,情況3推導矛盾,所以,情況1也不可能。

    轉載于:https://www.cnblogs.com/MyNameIsPc/p/7966152.html

    總結

    以上是生活随笔為你收集整理的tarjan求强连通分量的思考的全部內容,希望文章能夠幫你解決所遇到的問題。

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