青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

公告

記錄我的生活和工作。。。
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

統(tǒng)計(jì)

  • 隨筆 - 182
  • 文章 - 1
  • 評(píng)論 - 41
  • 引用 - 0

留言簿(10)

隨筆分類(lèi)(70)

隨筆檔案(182)

文章檔案(1)

如影隨形

搜索

  •  

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

有向圖強(qiáng)連通分量 Gabow 算法

 

When the depth-first search reaches a vertex v, the algorithm performs the following steps:

  1. Set the preorder number of v to C, and increment C.
  2. Push v onto S and also onto P.
  3. For each edge from v to a neighboring vertex w:
    • If the preorder number of w has not yet been assigned, recursively search w;
    • Otherwise, if w has not yet been assigned to a strongly connected component:
      • Repeatedly pop vertices from P until the top element of P has a preorder number less than or equal to the preorder number of w.
  4. If v is the top element of P:
    • Pop vertices from S until v has been popped, and assign the popped vertices to a new component.
    • Pop v from P.

 

Gabow_Algorithm偽代碼:

step1:

找一個(gè)沒(méi)有被訪問(wèn)過(guò)的節(jié)點(diǎn)v,goto step2(v)。否則,算法結(jié)束。

step2(v):

將v壓入堆棧stk1[]和stk2[]

對(duì)于v所有的鄰接頂點(diǎn)u:

1) 如果沒(méi)有訪問(wèn)過(guò),則step2(u)

2) 如果訪問(wèn)過(guò),但沒(méi)有刪除,維護(hù)stk2[](處理環(huán)的過(guò)程,在stk2 中刪除構(gòu)成環(huán)的節(jié)點(diǎn))

如果stk2[]的頂元素==v,那么輸出相應(yīng)的強(qiáng)連通分量

 

這個(gè)算法其實(shí)就是Tarjan算法的變異體,我們觀察一下,只是它用第二個(gè)堆棧來(lái)輔助求出強(qiáng)連通分量的根,而不是Tarjan算法里面的DFN[]和Low[]數(shù)組。那么,我們說(shuō)一下如何使用第二個(gè)堆棧來(lái)輔助求出強(qiáng)連通分量的根。

我們使用類(lèi)比方法,在Tarjan算法中,每次Low[i]的修改都是由于環(huán)的出現(xiàn)(不然,Low[i]的值不可能變小),每次出現(xiàn)環(huán),在這個(gè)環(huán)里面只剩下一個(gè)Low[i]沒(méi)有被改變(深度最低的那個(gè)),或者全部被改變,因?yàn)槟莻€(gè)深度最低的節(jié)點(diǎn)在另一個(gè)環(huán)內(nèi)。那么Gabow算 法中的第二堆棧變化就是刪除構(gòu)成環(huán)的節(jié)點(diǎn),只剩深度最低的節(jié)點(diǎn),或者全部刪除,這個(gè)過(guò)程是通過(guò)出棧來(lái)實(shí)現(xiàn),因?yàn)樯疃茸畹偷哪莻€(gè)頂點(diǎn)一定比前面的先訪問(wèn),那 么只要出棧一直到棧頂那個(gè)頂點(diǎn)的訪問(wèn)時(shí)間不大于深度最低的那個(gè)頂點(diǎn)。其中每個(gè)被彈出的節(jié)點(diǎn)屬于同一個(gè)強(qiáng)連通分量。那有人會(huì)問(wèn):為什么彈出的都是同一個(gè)強(qiáng)連 通分量?因?yàn)樵谶@個(gè)節(jié)點(diǎn)訪問(wèn)之前,能夠構(gòu)成強(qiáng)連通分量的那些節(jié)點(diǎn)已經(jīng)被彈出了,這個(gè)對(duì)Tarjan算法有了解的都應(yīng)該清楚,那么Tarjan算法中的判斷根我們用什么來(lái)代替呢?想想,其實(shí)就是看看第二個(gè)堆棧的頂元素是不是當(dāng)前頂點(diǎn)就可以了。

現(xiàn)在,你應(yīng)該明白其實(shí)Tarjan算法和Gabow算法其實(shí)是同一個(gè)思想的不同實(shí)現(xiàn),但是,Gabow算法更精妙,時(shí)間更少(不用頻繁更新Low[])。

 

QQ截圖未命名

 

代碼:

#include "cstdlib"
#include "cctype"
#include "cstring"
#include "cstdio"
#include "cmath"
#include "algorithm"
#include "vector"
#include "string"
#include "iostream"
#include "sstream"
#include "set"
#include "queue"
#include "stack"
#include "fstream"
#include "strstream"
using namespace std;

#define  M 2000              //題目中可能的最大點(diǎn)數(shù)      
int STACK[M],top=0;          //Gabow 算法中的輔助棧
int STACK2[M],top2=0;        //
int DFN[M];                  //深度優(yōu)先搜索訪問(wèn)次序
int ComponetNumber=0;        //有向圖強(qiáng)連通分量個(gè)數(shù)
int Index=0;                 //索引號(hào)
int Belong[M];               //某個(gè)點(diǎn)屬于哪個(gè)連通分支
vector <int> Edge[M];        //鄰接表表示
vector <int> Component[M];   //獲得強(qiáng)連通分量結(jié)果

void Gabow(int i)
{
    int j;
    DFN[i]=Index++;
    STACK[++top]=i;
    STACK2[++top2]=i;
    for (int e=0;e<Edge[i].size();e++)
    {
        j=Edge[i][e];
        if (DFN[j]==-1)  Gabow(j);
        else if (Belong[j]==-1)       //如果訪問(wèn)過(guò),但沒(méi)有刪除,維護(hù)STACK2
        {
            while(DFN[STACK2[top2]]>DFN[j])        //刪除構(gòu)成環(huán)的頂點(diǎn)
                top2--;
        }
    }
    if(i==STACK2[top2])               //如果Stack2 的頂元素等于i,輸出相應(yīng)的強(qiáng)連通分量
    {
        --top2; ++ComponetNumber;
        do
        {
            Belong[STACK[top]]=ComponetNumber;
            Component[ComponetNumber].push_back(STACK[top]);
        }while ( STACK[top--]!=i);
    }
}

void solve(int N)     //此圖中點(diǎn)的個(gè)數(shù),注意是0-indexed!
{
    memset(STACK,-1,sizeof(STACK));
    memset(STACK2,-1,sizeof(STACK2));
    memset(Belong,-1,sizeof(Belong));
    memset(DFN,-1,sizeof(DFN));

    for(int i=0;i<N;i++)
        if(DFN[i]==-1)
            Gabow(i);   
}
/*
此算法正常工作的基礎(chǔ)是圖是0-indexed的。但是獲得的結(jié)果Component數(shù)組和Belong數(shù)組是1-indexed
*/
int main()
{
    Edge[0].push_back(1);Edge[0].push_back(2);
    Edge[1].push_back(3);
    Edge[2].push_back(3);Edge[2].push_back(4);
    Edge[3].push_back(0);Edge[3].push_back(5);
    Edge[4].push_back(5);
    int  N=6;
    solve(N);
    cout<<"ComponetNumber is "<<ComponetNumber<<endl;
    for(int i=0;i<N;i++)
            cout<<Belong[i]<<" ";
    cout<<endl;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<Component[i].size();j++)
            cout<<Component[i][j];
        cout<<endl;
    }
    return 0;
}

 

Reference:

http://rchardx.is-programmer.com/posts/14898.html

wiki

 

終于搞完了SCC問(wèn)題的3大算法:

小總結(jié)一下:

 

三種算法的時(shí)間復(fù)雜度都是O(M+N) (N為圖的點(diǎn)數(shù),M為邊數(shù))

 

Tarjan 算法和Gabow算法思想類(lèi)似,在Tarjan算法中用Low[]數(shù)組來(lái)記錄所能達(dá)到的最小時(shí)間戳,而Gabow算法則是用Stack2[]輔助獲得了強(qiáng)連通分量的根!

二者實(shí)質(zhì)是一樣的!

 

Kosaraju 算法則是兩次DFS,所以在時(shí)間復(fù)雜度常數(shù)因子的比拼上,肯定拼不過(guò) Tarjan Gabow,但是額外的常數(shù)帶來(lái)了良好的拓?fù)湫再|(zhì)!它得到的節(jié)點(diǎn)是按照拓?fù)湫蚪M織好的,在求解2-SAT的過(guò)程中十分方便。

 

下面是題目來(lái)總結(jié)或者來(lái)一個(gè)求無(wú)向圖雙連通分量Tarjan算法 和求最近公共祖先的離線Tarjan算法!

 

再引用一次:

Tarjan算法與求無(wú)向圖的雙連通分量(割點(diǎn)、橋)的Tarjan算法也有著很深的聯(lián)系。學(xué)習(xí)該Tarjan算法,也有助于深入理解求雙連通分量的Tarjan算法,兩者可以類(lèi)比、組合理解。

求有向圖的強(qiáng)連通分量的Tarjan算法是以其發(fā)明者Robert Tarjan命名的。Robert Tarjan還發(fā)明了求雙連通分量的Tarjan算法,以及求最近公共祖先的離線Tarjan算法,在此對(duì)Tarjan表示崇高的敬意。

posted on 2010-09-27 14:07 Sosi 閱讀(1415) 評(píng)論(2)  編輯 收藏 引用

評(píng)論

# re: 有向圖強(qiáng)連通分量 Gabow 算法 2012-04-18 23:06 劉濤

您好,我用您的程序求有向圖的強(qiáng)連通分量。但是當(dāng)點(diǎn)數(shù)很多的時(shí)候,總是顯示stack overflow,我的編譯器是vs2008.請(qǐng)問(wèn)怎么解決這個(gè)問(wèn)題,謝謝。
您寫(xiě)的程序真心不錯(cuò),謝謝您的饋贈(zèng)。

# re: 有向圖強(qiáng)連通分量 Gabow 算法 2012-11-07 14:35 ynkdyx@sohu.com

話說(shuō)這不就是棧溢出了么,寫(xiě)的很明白了。如果怕棧溢出就把內(nèi)存開(kāi)大好了,再用上STL里的vector即可。@劉濤

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


統(tǒng)計(jì)系統(tǒng)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产成人高清精品| 久久精品一二三| 精品二区视频| 久久国产精品久久久久久久久久| 久久亚洲欧美国产精品乐播| 欧美亚洲午夜视频在线观看| 亚洲午夜久久久| 欧美91视频| 欧美激情五月| 欧美一区二区在线免费播放| 亚洲欧美一区二区激情| 欧美精品一区二区精品网| 欧美不卡三区| 久久黄金**| av成人激情| 亚洲性线免费观看视频成熟| 欧美三级韩国三级日本三斤| 91久久国产综合久久91精品网站 | 亚洲美女啪啪| 亚洲深夜福利网站| 国产精品一区二区在线观看| 黄色另类av| 99精品久久久| 女女同性精品视频| 在线视频免费在线观看一区二区| 洋洋av久久久久久久一区| 久久久噜噜噜久久久| 亚洲啪啪91| 欧美黄网免费在线观看| 欧美三级第一页| 亚洲欧洲视频在线| 欧美在线精品一区| 亚洲国产一区二区三区高清| 国产欧美日韩在线播放| 精品av久久707| 一区二区三区欧美日韩| 国产精品劲爆视频| 国产精品天美传媒入口| 9人人澡人人爽人人精品| 免费观看在线综合| 亚洲字幕一区二区| 免费成人网www| 欧美激情一区二区三级高清视频| 国产婷婷色一区二区三区| 欧美日韩激情小视频| 女女同性精品视频| 美女黄网久久| 久久久青草婷婷精品综合日韩| 一区二区久久久久久| 久久成人人人人精品欧| 久久久久九九视频| 99re6这里只有精品视频在线观看| 国产精品99一区| 欧美精品激情| 欧美极品色图| 欧美伦理在线观看| 欧美色综合天天久久综合精品| 亚洲色无码播放| 欧美一站二站| 欧美精品三级日韩久久| 久久久久高清| 亚洲经典一区| 亚洲精选视频在线| 免费看成人av| 亚洲国产精品成人一区二区| 久久久久久91香蕉国产| 欧美激情91| 亚洲欧洲在线视频| 欧美成人一区二区三区片免费| 国产精品免费视频观看| 免费h精品视频在线播放| 亚洲影院免费观看| 亚洲精品中文字幕有码专区| 亚洲精品美女在线观看| 国产精品99免费看| 欧美一区国产二区| 欧美黄色一区二区| 亚洲精品在线免费| 亚洲靠逼com| 亚洲精品乱码久久久久| 欧美成在线观看| 亚洲一区二区免费看| 亚洲国产专区校园欧美| 欧美性猛交xxxx乱大交蜜桃| 久久精品一区二区| 亚洲国产欧美一区二区三区久久 | 91久久午夜| 亚洲一区二区三区久久| 欧美国产免费| 欧美午夜精品| 欧美日韩少妇| 国产在线视频欧美| 一本久久青青| 亚洲欧洲日产国产网站| 欧美成年人在线观看| 亚洲精品三级| 久久一区二区三区国产精品| 日韩天天综合| 亚洲精品之草原avav久久| 一本一本久久| 在线看一区二区| 欧美激情成人在线| aⅴ色国产欧美| 久久精品青青大伊人av| 亚洲天堂免费观看| 国内自拍亚洲| 亚洲国产成人不卡| 亚洲片在线资源| 欧美自拍偷拍午夜视频| 亚洲电影av| 欧美91精品| 久久久水蜜桃| 午夜在线观看欧美| 欧美国产一区二区| 欧美一区日韩一区| 午夜精品久久久| 亚洲最新合集| 亚洲一二三四区| 久久精品视频在线看| 亚洲视频综合在线| 日韩亚洲欧美高清| 久久久久一区二区三区| 亚洲一二三区在线观看| 一本大道av伊人久久综合| 久久青草久久| 欧美日韩亚洲一区在线观看| 欧美风情在线观看| 久久精品人人做人人爽| 久久噜噜亚洲综合| 久久精品国产久精国产一老狼| 一区二区三区偷拍| 国产精品99久久久久久久久| 在线精品亚洲| 欧美日本一区二区三区| 欧美日韩中文字幕在线| 亚洲一区一卡| 亚洲欧美视频在线观看视频| 艳女tv在线观看国产一区| 欧美一区不卡| 欧美婷婷六月丁香综合色| 国产一区美女| 日韩图片一区| 久久婷婷国产综合国色天香| 老司机精品视频一区二区三区| 欧美成人午夜剧场免费观看| 国产精品久久久久久av下载红粉 | 在线精品国产欧美| 在线观看欧美日韩国产| 亚洲清纯自拍| 亚洲一区二区三区久久| 欧美日韩亚洲一区二区| 欧美国产综合一区二区| 国产精品女人久久久久久| 亚洲婷婷综合色高清在线| 免费在线观看精品| 久久日韩粉嫩一区二区三区| 亚洲人成免费| 欧美一区二区三区免费观看视频 | 欧美不卡视频| 欧美精品一区在线播放| 狠狠色狠狠色综合人人| 一区二区成人精品| 99视频热这里只有精品免费| 国产一区二区视频在线观看 | 一区二区三区日韩欧美精品| 欧美理论电影网| 国产日韩免费| 亚洲永久免费精品| 一本一本大道香蕉久在线精品| 蜜桃精品久久久久久久免费影院| 韩国一区二区三区在线观看| 欧美va天堂在线| 久久婷婷麻豆| 欧美h视频在线| 亚洲欧美www| 9色精品在线| 国产欧美亚洲一区| 欧美成人一区二区三区片免费| 久久中文字幕一区| 亚洲人成网站影音先锋播放| 欧美成人综合在线| 欧美三级第一页| 91久久久国产精品| 欧美日韩国产一区二区三区地区 | 亚洲免费视频中文字幕| 老司机精品福利视频| 一区二区三区欧美| 久久精品亚洲一区| 香蕉久久久久久久av网站| 欧美成人一区二区三区在线观看| 亚洲天堂免费观看| 1204国产成人精品视频| 欧美日韩理论| 男男成人高潮片免费网站| 国产精品青草久久久久福利99| 久久精品在线观看| 欧美日韩午夜精品| 亚洲激情国产精品| 国产日韩在线不卡| 99亚洲视频|