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

公告

記錄我的生活和工作。。。
<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>
              裸体女人亚洲精品一区| 老司机免费视频久久| 亚洲日本视频| 欧美韩日高清| 一本色道久久综合亚洲精品小说 | 亚洲美女av在线播放| 欧美精品久久天天躁| 一区二区精品| 亚洲免费视频在线观看| 国产在线精品二区| 久久免费黄色| 欧美精品免费视频| 亚洲一区久久久| 欧美一乱一性一交一视频| 国内成人精品2018免费看| 欧美成人按摩| 欧美日韩dvd在线观看| 午夜精品免费在线| 久久人人97超碰国产公开结果| 91久久亚洲| 亚洲视频在线二区| 揄拍成人国产精品视频| 亚洲乱码国产乱码精品精可以看| 欧美午夜免费| 开心色5月久久精品| 欧美久久久久中文字幕| 亚洲综合久久久久| 美女精品一区| 欧美一区二区三区免费视频| 久久精品首页| 亚洲综合第一| 欧美1区2区| 久久精品视频播放| 欧美人与性动交cc0o| 久热精品在线| 国产精品视频最多的网站| 亚洲国产成人av好男人在线观看| 欧美体内谢she精2性欧美| 蘑菇福利视频一区播放| 国产精品久久久久久久久免费桃花| 欧美sm视频| 国产日韩精品在线播放| 亚洲另类在线视频| 亚洲二区免费| 欧美亚洲一区二区三区| 亚洲午夜电影网| 欧美福利电影网| 老司机精品福利视频| 国产精品亚洲第一区在线暖暖韩国| 亚洲人成啪啪网站| 亚洲国产高清aⅴ视频| 欧美一二三区在线观看| 亚洲欧美日韩天堂| 欧美视频日韩视频在线观看| 欧美高清视频在线| 一色屋精品视频在线看| 欧美一区二区三区成人| 亚洲影视在线播放| 欧美日韩一区二区三区在线看| 欧美激情视频免费观看| 在线免费观看视频一区| 久久av免费一区| 欧美专区在线观看| 国产精品青草久久| 亚洲午夜精品一区二区| 亚洲免费影视| 国产精品亚洲а∨天堂免在线| 一本色道婷婷久久欧美| 亚洲一区三区电影在线观看| 欧美精品午夜| 中日韩视频在线观看| 亚洲特级毛片| 国产精品亚洲片夜色在线| 亚洲校园激情| 久久久成人网| 黄色精品一区| 欧美1区2区| 亚洲免费观看高清在线观看| 一本色道久久综合亚洲精品小说 | 欧美四级在线| 亚洲一区二区三区久久| 久久久99免费视频| 在线免费观看日韩欧美| 欧美国产精品劲爆| av不卡在线看| 欧美一区二区三区四区夜夜大片| 国产日产欧产精品推荐色 | 欧美午夜不卡视频| 亚洲一区国产精品| 麻豆freexxxx性91精品| 亚洲黄色在线| 欧美日韩一本到| 欧美一区免费| 亚洲精品1区| 午夜在线播放视频欧美| 激情综合久久| 欧美日韩国产综合久久| 亚洲欧美清纯在线制服| 免费在线成人av| 亚洲专区在线视频| 狠狠色狠色综合曰曰| 欧美理论电影在线观看| 亚洲免费影视| 亚洲欧洲美洲综合色网| 欧美一级久久久久久久大片| 亚洲高清免费视频| 国产精品久久久久7777婷婷| 久久久久久高潮国产精品视| 99国内精品久久久久久久软件| 久久九九全国免费精品观看| 亚洲精品免费在线| 国产视频在线一区二区| 欧美激情1区| 久久国产精品黑丝| aa日韩免费精品视频一| 女女同性精品视频| 久久av二区| 亚洲一级特黄| 亚洲经典一区| 精品成人在线| 国产精品高精视频免费| 欧美成人激情视频| 久久精品视频免费| 亚洲欧美电影在线观看| 亚洲免费观看高清在线观看| 免费成人在线观看视频| 久久成人亚洲| 亚洲欧美日韩中文播放| 99一区二区| 亚洲三级视频在线观看| 影音先锋日韩资源| 国产一区二区三区久久 | 亚洲欧美视频| 夜夜精品视频| 亚洲精品一区二区三区不| 在线播放日韩欧美| 狠狠噜噜久久| 国产小视频国产精品| 国产精品久线观看视频| 欧美日韩精品二区| 欧美日韩国产首页在线观看| 欧美高清在线视频| 男女激情久久| 欧美二区在线播放| 欧美福利视频网站| 你懂的网址国产 欧美| 久久野战av| 久久视频国产精品免费视频在线| 欧美一级在线播放| 久久精品人人做人人综合| 性欧美videos另类喷潮| 亚洲综合视频1区| 亚洲影院免费| 亚洲欧美中文在线视频| 午夜在线观看欧美| 久久精品一区二区三区四区 | 欧美一二三区精品| 久久精品72免费观看| 久久精品一二三| 老鸭窝毛片一区二区三区| 欧美国产日韩精品免费观看| 欧美激情按摩在线| 欧美视频在线播放| 国产欧美va欧美不卡在线| 国产一区在线免费观看| 狠狠色狠狠色综合日日tαg| 亚洲第一在线综合在线| 亚洲美女诱惑| 午夜电影亚洲| 久久婷婷国产综合尤物精品| 欧美黄色一级视频| 9色精品在线| 欧美在线91| 欧美bbbxxxxx| 国产精品欧美久久| 精品999网站| 在线亚洲观看| 久久精品国产第一区二区三区最新章节 | 国产精品久久久久秋霞鲁丝 | 欧美成年人网| 国产精品狼人久久影院观看方式| 国产日韩精品一区二区浪潮av| 在线观看亚洲一区| 亚洲视频精品| 麻豆国产精品777777在线| 亚洲精品美女在线观看播放| 欧美在线观看网址综合| 欧美激情综合亚洲一二区| 国产一区清纯| 一区二区三区国产| 久久婷婷国产麻豆91天堂| 99国产精品自拍| 久久久午夜精品| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 亚洲欧美在线高清| 欧美成人午夜视频| 国产又爽又黄的激情精品视频| 日韩性生活视频| 久久亚洲视频| 亚洲欧美视频在线观看视频|