亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

求有向圖的強連通分量(scc):Tarjan算法

系統 1679 0

1,在有向圖G中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量(strongly connected component)。
2,下圖中,子圖{1,2,3,4}為一個強連通分量,因為頂點1,2,3,4兩兩可達。{5},{6}也分別是兩個強連通分量。
求有向圖的強連通分量(scc):Tarjan算法

3,Tarjan算法是基于對圖深度優先搜索的算法,每個強連通分量為搜索樹中的一棵子樹。搜索時,把當前搜索樹中未處理的節點加入一個堆棧,回溯時可以判斷棧頂到棧中的節點是否為一個強連通分量。
定義幾個關鍵數組:
int DFN[MAX]; //記錄節點u第一次被訪問時的步數
int LOW[MAX]; //記錄與節點u和u的子樹節點中最早的步數
接下來是對算法流程的演示。
從節點1開始DFS,把遍歷到的節點加入棧中。搜索到節點u=6時,DFN[6]=LOW[6],找到了一個強連通分量。退棧到u=v為止,{6}為一個強連通分量。
求有向圖的強連通分量(scc):Tarjan算法

返回節點5,發現DFN[5]=LOW[5],退棧后{5}為一個強連通分量。
求有向圖的強連通分量(scc):Tarjan算法

返回節點3,繼續搜索到節點4,把4加入堆棧。發現節點4向節點1有后向邊,節點1還在棧中,所以LOW[4]=1。節點6已經出棧,(4,6)是橫叉邊,返回3,(3,4)為樹枝邊,所以LOW[3]=LOW[4]=1。
求有向圖的強連通分量(scc):Tarjan算法

繼續回到節點1,最后訪問節點2。訪問邊(2,4),4還在棧中,所以LOW[2]=DFN[4]=5。返回1后,發現DFN[1]=LOW[1],把棧中節點全部取出,組成一個連通分量{1,3,4,2}。
求有向圖的強連通分量(scc):Tarjan算法

至此,算法結束。經過該算法,求出了圖中全部的三個強連通分量{1,3,4,2},{5},{6}。

分析:
運行Tarjan算法的過程中,每個頂點都被訪問了一次,且只進出了一次堆棧,每條邊也只被訪問了一次,所以該算法的時間復雜度為O(N+M)。

4,實例代碼:

Cpp代碼 復制代碼
  1. #include<iostream> ??
  2. #include<vector> ??
  3. using ? namespace ?std; ??
  4. ??
  5. const ? int ?MAX=10001; ??
  6. ??
  7. int ?Stop; //棧中的元素個數 ??
  8. int ?cnt; //記錄連通分量的個數 ??
  9. int ?visitNum; //記錄遍歷的步數 ??
  10. int ?DFN[MAX];? //記錄節點u第一次被訪問時的步數 ??
  11. int ?LOW[MAX];? //記錄與節點u和u的子樹節點中最早的步數 ??
  12. bool ?instack[MAX]; //記錄節點u是否在棧中 ??
  13. int ?Stap[MAX]; //棧 ??
  14. int ?Belong[MAX]; //記錄每個節點屬于的強連通分量編號 ??
  15. ??
  16. int ?N; //節點個數 ??
  17. ??
  18. vector< int >?tree[MAX]; ??
  19. ??
  20. void ?tarjan( int ?i) ??
  21. { ??
  22. ???? int ?j; ??
  23. ????DFN[i]=LOW[i]=++visitNum; ??
  24. ????instack[i]= true ; ??
  25. ????Stap[++Stop]=i; //將當前節點壓入棧中 ??
  26. ???? for ?(unsigned?k=0;k<tree[i].size();k++) ??
  27. ????{ ??
  28. ????????j=tree[i][k]; ??
  29. ???????? if ?(!DFN[j])? //j還沒有被訪問過 ??
  30. ????????{ ??
  31. ????????????tarjan(j); ??
  32. ???????????? //父節點是子節點的子節點 ??
  33. ???????????? if ?(LOW[j]<LOW[i]) ??
  34. ????????????????LOW[i]=LOW[j]; ??
  35. ????????} ??
  36. ???????? //與j相連,但是j已經被訪問過,且還在棧中 ??
  37. ???????? //用子樹節點更新節點第一次出現的時間 ??
  38. ???????? else ? if ?(instack[j]?&&?DFN[j]<LOW[i]) ??
  39. ????????????LOW[i]=DFN[j]; ??
  40. ????} ??
  41. ???? //節點i是強連通分量的根 ??
  42. ???? if ?(DFN[i]==LOW[i]) ??
  43. ????{ ??
  44. ????????cnt++; ??
  45. ???????? //輸出找到的強連通分量 ??
  46. ????????cout<< "連通分量" <<cnt<< ":?" ; ??
  47. ???????? //退棧,直至找到根為止 ??
  48. ???????? do ??
  49. ????????{ ??
  50. ????????????j=Stap[Stop--]; ??
  51. ????????????instack[j]= false ; ??
  52. ????????????cout<<j<< "?" ; ??
  53. ????????????Belong[j]=cnt; ??
  54. ????????} ??
  55. ???????? while ?(j!=i); ??
  56. ????????cout<<endl; ??
  57. ????} ??
  58. } ??
  59. void ?solve() ??
  60. { ??
  61. ????Stop=cnt=visitNum=0; ??
  62. ????memset(DFN,0, sizeof (DFN)); ??
  63. ???? for ?( int ?i=1;i<=N;i++) ??
  64. ???????? if ?(!DFN[i]) //有可能圖不是連通圖 ??
  65. ????????????tarjan(i); ??
  66. } ??
  67. ??
  68. int ?main() ??
  69. { ??
  70. ????N=6; ??
  71. ????tree[1].push_back(3); ??
  72. ????tree[1].push_back(2); ??
  73. ????tree[2].push_back(4); ??
  74. ????tree[3].push_back(5); ??
  75. ????tree[3].push_back(4); ??
  76. ????tree[4].push_back(1); ??
  77. ????tree[4].push_back(6); ??
  78. ????tree[5].push_back(6); ??
  79. ????solve(); ??
  80. ???? for ( int ?i=1;i<=N;i++) ??
  81. ????????cout<<Belong[i]<< "?" ; ??
  82. ????cout<<endl; ??
  83. ???? return ?0; ??
  84. }??

求有向圖的強連通分量(scc):Tarjan算法


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩毛片 | 久久精品国产精品青草 | 中文字幕综合久久久久 | 欧美亚洲精品小说一区二三区 | 亚欧aⅴ天堂在线 | 国产成人综合网在线观看 | 精品在线一区二区三区 | 国产一区二区三区在线观看视频 | 国产免费播放一区二区三区 | 四虎海外影院 | 成年午夜性视频免费播放 | 国产欧美精品综合一区 | 9久热 | 99久久精品国产片久人 | 久久香蕉久久 | 狠狠久久久久久亚洲综合网 | 人人乳乳香蕉大免费 | 农村妇女又色黄一级毛片 | 欧美成人性色xxxx视频 | 国产精品福利尤物youwu | 国产亚洲欧美日韩在线看片 | 国产精品视频久 | 亚洲图片一区二区 | 一级毛片在线看在线播放 | 国内精品免费久久影院 | 国产午夜亚洲精品国产 | 国产成人亚洲综合a∨婷婷 国产成人亚洲综合欧美一部 | 羞羞的视频网站 | 五月婷婷伊人 | 久久99精品一区二区三区 | 国产精品岛国久久久久 | 欧美6699在线视频免费 | 久久国产精品岛国搬运工 | 999久久狠狠免费精品 | 99在线播放 | 国产香蕉在线视频一级毛片 | 色图综合网 | 日韩精品在线一区 | 一区不卡| 国产一级淫片a视频免费观看 | 亚洲精品国产成人专区 |