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

公告

記錄我的生活和工作。。。
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

統(tǒng)計(jì)

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

留言簿(10)

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

隨筆檔案(182)

文章檔案(1)

如影隨形

搜索

  •  

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

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

   It makes use of the fact that the transpose graph (the same graph with the direction of every edge reversed) has exactly the same strongly connected components as the original graph.

   它利用了有向圖的這樣一個(gè)性質(zhì),一個(gè)圖和他的transpose graph(邊全部反向)具有相同的強(qiáng)連通分量!

算法偽代碼

Kosaraju's algorithm is simple and works as follows:

  • Let G be a directed graph and S be an empty stack.
  • While S does not contain all vertices:
    • Choose an arbitrary vertex v not in S. Perform a depth-first search starting at v. Each time that depth-first search finishes expanding a vertex u, push u onto S.
  • Reverse the directions of all arcs to obtain the transpose graph.
  • While S is nonempty:
    • Pop the top vertex v from S. Perform a depth-first search starting at v. The set of visited vertices will give the strongly connected component containing v; record this and remove all these vertices from the graph G and the stack S. Equivalently,breadth-first search (BFS) can be used instead of depth-first search.

 

 

需要注意的是這里的第一遍BFS搜索的時(shí)候的入隊(duì)序列,Each time that depth-first search finishes expanding a vertex u, push u onto S.只有當(dāng)擴(kuò)展結(jié)束了此節(jié)點(diǎn)之后,此節(jié)點(diǎn)才會(huì)被push onto S.

算法思路:

1, 后序遍歷原圖,對(duì)每個(gè)訪問(wèn)到的節(jié)點(diǎn)標(biāo)記時(shí)間戳。

2, 按照時(shí)間戳的降序遍歷反向圖,得到的每個(gè)連通塊就是一個(gè)強(qiáng)連通分量。

證明是很簡(jiǎn)單的:

假設(shè)以上算法從u訪問(wèn)到了v,那么說(shuō)明反向圖有一條從u到v的邊,也就說(shuō)明了原圖中有一條從v到u的邊,又因?yàn)閡的標(biāo)號(hào)是大于v的,那么,u一定在v之前訪問(wèn)到(否則v的標(biāo)號(hào)將大于u),并且是從u訪問(wèn)到v了的(v到u也有一條路徑,否則就會(huì)從v訪問(wèn)到u)。

 

QQ截圖未命名

如果應(yīng)用我們第一個(gè)Tarjan算法的例子的話,第一遍DFS 得到的次序是 6 4 2 5 3 1

 

代碼

#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
bool vis[M];                 //遍歷數(shù)組
int post[M];                 //時(shí)間戳對(duì)應(yīng)的點(diǎn)
int timestamp;               //時(shí)間戳
int ComponetNumber=0;        //有向圖強(qiáng)連通分量個(gè)數(shù)
vector <int> Edge[M];        //鄰接表表示
vector <int> Opp[M];         //原圖的反圖
vector <int> Component[M];   //獲得強(qiáng)連通分量結(jié)果

void dfs(int u) {             //第一個(gè)dfs確定時(shí)間戳
    vis[u] = true;
    for(int i=0;i<Edge[u].size();i++) {
        if(vis[ Edge[u][i]])    continue;
        //cout<<Edge[u][i]<<endl;
        dfs(Edge[u][i]);
    }
    //cout<<"timestamp    "<<timestamp<<"       "<<u<<endl;   
    post[timestamp++] = u;
}

void dfs2(int u) {      //第二個(gè)反邊dfs確定連通塊
    vis[u] = true;
    Component[ComponetNumber].push_back(u);
    for(int i=0;i<Opp[u].size();i++)
    {
        int v = Opp[u][i];
        if(vis[v])  continue;
        dfs2(v);
    }
}

void Kosaraju(int n) {
    memset(vis,0,sizeof(vis));
    timestamp = 0;
    for(int i=0;i<n;i++) {
        if(vis[i])    continue;
        dfs(i);
    }
    memset(vis,0,sizeof(vis));
    ComponetNumber++;
    for(int i=n-1;i>=0;i--) {//按時(shí)間戳從大到小搜
        if(vis[post[i]])    continue;
        Component[ComponetNumber].clear();
        dfs2(post[i]);
        ComponetNumber++;
    }
    ComponetNumber--;      //最后我們把塊加了1。。所以要減掉
}
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);

    Opp[0].push_back(3);
    Opp[1].push_back(0);
    Opp[2].push_back(0);
    Opp[3].push_back(1);Opp[3].push_back(2);
    Opp[4].push_back(2);
    Opp[5].push_back(3);Opp[6].push_back(4);
    int  N=6;
    Kosaraju(N);
    cout<<"ComponetNumber is "<<ComponetNumber<<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;
}

 

 

    此算法的時(shí)間復(fù)雜度當(dāng)然也是 O(M+N)(M條邊,N個(gè)點(diǎn))與Tarjan算法相似。。但是在系數(shù)上不如Tarjan算法!在實(shí)際的測(cè)試中,Tarjan算法的運(yùn)行效率也比Kosaraju算法高30%左右。 

    當(dāng)然Kosaraju算法額外花費(fèi)的時(shí)間,也不是白費(fèi)的,它獲得了圖的一個(gè)拓?fù)湫再|(zhì)哦!!

    如果我們把求出來(lái)的每個(gè)強(qiáng)連通分量收縮成一個(gè)點(diǎn),并且用求出每個(gè)強(qiáng)連通分量的順序來(lái)標(biāo)記收縮后的節(jié)點(diǎn),那么這個(gè)順序其 實(shí)就是強(qiáng)連通分量收縮成點(diǎn)后形成的有向無(wú)環(huán)圖的拓?fù)湫蛄?/strong>。為什么呢?首先,應(yīng)該明確搜索后的圖一定是有向無(wú)環(huán)圖呢?廢話,如果還有環(huán),那么環(huán)上的頂點(diǎn)對(duì)應(yīng) 的所有原來(lái)圖上的頂點(diǎn)構(gòu)成一個(gè)強(qiáng)連通分量,而不是構(gòu)成環(huán)上那么多點(diǎn)對(duì)應(yīng)的獨(dú)自的強(qiáng)連通分量了。然后就是為什么是拓?fù)湫蛄校覀冊(cè)诟倪M(jìn)分析的時(shí)候,不是先選 的樹(shù)不會(huì)連通到其他樹(shù)上(對(duì)于反圖GT來(lái)說(shuō)),也就是后選的樹(shù)沒(méi)有連通到先選的樹(shù),也即先出現(xiàn)的強(qiáng)連通分量收縮的點(diǎn)只能指向后出現(xiàn)的強(qiáng)連通分量收縮的點(diǎn)。那么拓?fù)湫蛄胁皇抢硭?dāng)然的嗎?這就是Kosaraju算法的一個(gè)隱藏性質(zhì)。

 

Reference :

http://www.notonlysuccess.com/?p=181

推薦一下啊!終于算是搞的差不多了。。下面就是做一些練習(xí),然后鞏固提高一下!接下來(lái)剩下的最后一個(gè)算法了:Gabow 算法

posted on 2010-09-26 22:49 Sosi 閱讀(1870) 評(píng)論(1)  編輯 收藏 引用

評(píng)論

# re: 有向圖強(qiáng)連通分量 Kosaraju算法 2013-04-29 19:13 ygqwan

樓主的第一次post數(shù)組是不是存錯(cuò)了呢

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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美成人精品在线| 欧美黄色日本| 欧美黄色视屏| 99国产精品国产精品久久| 在线观看av一区| 激情婷婷欧美| 亚洲手机在线| 午夜日韩视频| 亚洲第一精品夜夜躁人人爽| 欧美韩日一区| 亚洲黄网站在线观看| 欧美国产一区二区三区激情无套| 一区二区免费在线视频| 国产精品a久久久久| 午夜精品免费| 久久国产欧美精品| 欧美视频免费在线| 国产日韩综合一区二区性色av| 国产一区二区精品在线观看| 日韩视频在线免费| 91久久精品视频| 亚洲精品人人| 亚洲一区免费| 国产片一区二区| 欧美午夜美女看片| 好吊妞**欧美| 正在播放亚洲一区| 亚洲一级黄色av| 国产美女搞久久| 亚洲精品在线三区| 另类人畜视频在线| 欧美成人四级电影| 亚洲欧美激情四射在线日| 免费观看亚洲视频大全| 亚洲欧美制服中文字幕| 伊人成年综合电影网| 亚洲经典在线看| 国产精品人人爽人人做我的可爱 | av成人免费观看| 这里只有精品丝袜| 好看的av在线不卡观看| 亚洲欧洲精品一区| 国产欧美日韩精品丝袜高跟鞋| 免费观看欧美在线视频的网站| 欧美精品日韩一区| 国产精品国产亚洲精品看不卡15 | 亚洲永久在线观看| av成人免费观看| 欧美美女bb生活片| 久久狠狠久久综合桃花| 99re这里只有精品6| 国产亚洲精品久久久久久| 女女同性精品视频| 国产精品多人| 欧美va亚洲va香蕉在线| 欧美日精品一区视频| 久热精品视频在线| 亚洲免费综合| 免费欧美电影| 国产综合在线看| 久久久久这里只有精品| 久久成人免费网| 一区二区三区欧美激情| 亚洲国产日韩一区| 欧美高清视频一区二区三区在线观看 | 欧美大片在线看免费观看| 性xx色xx综合久久久xx| 久久综合久久综合久久综合| 午夜精品视频在线观看| 免费一级欧美在线大片| 久久成人av少妇免费| 欧美日韩a区| 欧美mv日韩mv国产网站| 国产精品进线69影院| 亚洲福利在线观看| 国产主播在线一区| 一区二区三区欧美视频| 亚洲日本va午夜在线电影| 男女av一区三区二区色多| 国产精品xxxxx| 亚洲国产成人精品女人久久久| 国产亚洲午夜| 亚洲手机视频| 99国产精品视频免费观看一公开| 欧美中文在线免费| 小嫩嫩精品导航| 欧美日韩在线视频观看| 亚洲大片免费看| 有码中文亚洲精品| 午夜精品久久| 一级日韩一区在线观看| 老司机精品视频一区二区三区| 国产九九精品视频| 香蕉精品999视频一区二区| 欧美区亚洲区| 亚洲国产1区| 在线欧美视频| 亚洲欧美中日韩| 一本色道久久88综合亚洲精品ⅰ| 午夜伦欧美伦电影理论片| 亚洲女与黑人做爰| 欧美成人精品h版在线观看| 久久av红桃一区二区小说| 欧美日韩视频| 亚洲欧美经典视频| 欧美v日韩v国产v| 久久精品九九| 国产精品嫩草久久久久| 亚洲精品视频在线看| 在线日韩中文| 久久久午夜电影| 欧美阿v一级看视频| 在线观看91精品国产麻豆| 欧美在线免费| 久久久美女艺术照精彩视频福利播放| 国产精品影音先锋| 一区二区高清视频| 亚洲精品中文字幕女同| 久久久久国产精品www| 久久精品国产免费看久久精品| 欧美亚一区二区| av不卡在线观看| 亚洲一区二区在| 国产精品大片| 亚洲视频在线观看| 欧美一区二区精品久久911| 国产精品一区二区女厕厕| 亚洲欧美日韩一区| 久久精品国产一区二区三| 国产一区二区电影在线观看| 久久国产手机看片| 蜜桃精品一区二区三区| 亚洲国产美女精品久久久久∴| 欧美大片网址| 亚洲视频www| 亚洲美女淫视频| 一区二区欧美激情| 欧美屁股在线| 中国av一区| 日韩视频在线一区| 欧美日韩精品免费观看视一区二区 | 久久综合中文| 亚洲福利视频二区| 亚洲高清自拍| 亚洲美女色禁图| 国产精品高潮粉嫩av| 亚洲欧美视频一区二区三区| 久久久久久97三级| 亚洲黄色免费网站| 欧美日韩免费高清| 亚洲一区二区免费在线| 久久久999精品免费| 亚洲国产欧美一区二区三区同亚洲 | 欧美日韩三区| 香蕉久久久久久久av网站| 久久综合中文色婷婷| 日韩一区二区久久| 国产精品久久久久久久电影| 欧美一二三区在线观看| 欧美成人免费全部| 亚洲视频一区二区免费在线观看| 国产精品一卡二卡| 久久综合影视| 日韩亚洲在线| 久久嫩草精品久久久精品| 亚洲高清123| 欧美午夜电影一区| 久久精品成人一区二区三区| 欧美激情bt| 亚洲欧美日韩精品久久亚洲区| 国内视频一区| 欧美激情第二页| 亚洲影视在线| 欧美激情精品久久久久久久变态| 亚洲午夜精品久久久久久浪潮| 欧美一级夜夜爽| 亚洲精美视频| 国产精品视频1区| 你懂的视频一区二区| 亚洲视频播放| 欧美福利一区二区三区| 午夜精品国产更新| 亚洲国产经典视频| 国产精品美女久久久免费 | 最新日韩av| 国产精品成人一区二区三区夜夜夜| 性欧美大战久久久久久久免费观看| 亚洲国产精品电影在线观看| 欧美一区二区三区免费观看| 亚洲国产精品久久久久久女王| 国产精品激情电影| 牛牛精品成人免费视频| 亚洲欧美日韩国产精品| 亚洲国产视频一区二区| 久久se精品一区二区| 一区二区三区 在线观看视频| 好吊视频一区二区三区四区| 欧美系列一区| 欧美高清视频在线播放| 欧美一区二区三区日韩|