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

O(1) 的小樂

Job Hunting

公告

記錄我的生活和工作。。。
<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

統(tǒng)計(jì)

  • 隨筆 - 182
  • 文章 - 1
  • 評論 - 41
  • 引用 - 0

留言簿(10)

隨筆分類(70)

隨筆檔案(182)

文章檔案(1)

如影隨形

搜索

  •  

最新隨筆

最新評論

閱讀排行榜

評論排行榜

有向圖強(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.

   它利用了有向圖的這樣一個性質(zhì),一個圖和他的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)才會被push onto S.

算法思路:

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

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

證明是很簡單的:

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

 

QQ截圖未命名

如果應(yīng)用我們第一個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í)間戳對應(yīng)的點(diǎn)
int timestamp;               //時(shí)間戳
int ComponetNumber=0;        //有向圖強(qiáng)連通分量個數(shù)
vector <int> Edge[M];        //鄰接表表示
vector <int> Opp[M];         //原圖的反圖
vector <int> Component[M];   //獲得強(qiáng)連通分量結(jié)果

void dfs(int u) {             //第一個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) {      //第二個反邊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個點(diǎn))與Tarjan算法相似。。但是在系數(shù)上不如Tarjan算法!在實(shí)際的測試中,Tarjan算法的運(yùn)行效率也比Kosaraju算法高30%左右。 

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

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

 

Reference :

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

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

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

評論

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

樓主的第一次post數(shù)組是不是存錯了呢
  回復(fù)  更多評論    

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   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>
              亚洲网站视频福利| 欧美v国产在线一区二区三区| 欧美午夜精品伦理| 欧美日韩国产在线一区| 欧美日韩国产色视频| 欧美天天综合网| 国产精品久久久久久久久搜平片| 国产精品乱码妇女bbbb| 国产亚洲一区二区精品| 亚洲高清在线观看一区| 亚洲视频观看| 久久精品国产精品亚洲| 欧美国产乱视频| 日韩一区二区免费高清| 欧美一区二区三区四区在线观看地址| 久久久久久伊人| 欧美日韩国产成人高清视频| 国产精品自在欧美一区| 亚洲福利视频三区| 亚洲一区精品电影| 猛男gaygay欧美视频| 在线视频你懂得一区| 久久亚洲图片| 国产精品一区二区三区成人| 在线色欧美三级视频| 亚洲一区二区三区成人在线视频精品 | 亚洲天堂av高清| 先锋影院在线亚洲| 欧美久久久久免费| 一色屋精品视频在线观看网站| 日韩网站在线| 免费看成人av| 欧美一区免费| 国产精品久久久久aaaa樱花 | 午夜精品三级视频福利| 欧美激情网友自拍| 久久九九热免费视频| 国产精品美女久久久浪潮软件| 亚洲精品永久免费| 免费成人av在线看| 午夜精品久久久久99热蜜桃导演| 欧美精品一区二区三区一线天视频 | 亚洲国产日韩欧美在线图片| 在线一区二区三区四区| 欧美激情免费在线| 猛男gaygay欧美视频| 先锋资源久久| 一本在线高清不卡dvd| 裸体一区二区三区| 国内精品国产成人| 久久国产精品99精品国产| 一区二区三区免费网站| 欧美精品久久久久久久免费观看 | 国产欧美在线| 午夜宅男欧美| 亚洲综合不卡| 国产日韩欧美中文在线播放| 亚洲欧美区自拍先锋| 中国成人在线视频| 国产精品久久久久毛片软件 | 国产精品日韩精品欧美精品| 中文日韩在线| 一本色道88久久加勒比精品 | 久久亚洲一区| 亚洲国产人成综合网站| 欧美大片免费久久精品三p| 久久久亚洲欧洲日产国码αv | 欧美一级视频| 新片速递亚洲合集欧美合集| 国产视频在线观看一区二区三区| 亚久久调教视频| 欧美一区二区三区视频免费| 国内精品国语自产拍在线观看| 久久婷婷丁香| 欧美成人一区二区三区在线观看| 日韩亚洲在线| 亚洲自拍偷拍福利| 激情综合中文娱乐网| 欧美福利视频在线| 欧美日韩精品一区二区在线播放 | 国产农村妇女精品| 久久久人成影片一区二区三区观看| 久久精品成人一区二区三区| 亚洲激情中文1区| 一区二区三区回区在观看免费视频 | 玖玖精品视频| 亚洲一区久久| 久久久久久久999精品视频| 亚洲人成人一区二区三区| 一级成人国产| 亚洲成人在线网站| 中文无字幕一区二区三区| 国内揄拍国内精品久久| 亚洲第一毛片| 欧美性猛交99久久久久99按摩| 一区二区三区成人精品| 亚洲午夜成aⅴ人片| 好看的av在线不卡观看| 亚洲美女黄色| 国内精品久久久久久久影视蜜臀| 亚洲福利视频专区| 国产精品美女www爽爽爽视频| 免费不卡中文字幕视频| 国产精品久久久久7777婷婷| 麻豆精品国产91久久久久久| 欧美日韩一区二区三区免费看| 久久久久九九九九| 欧美午夜在线观看| 欧美大片在线看| 国产视频一区二区三区在线观看| 91久久极品少妇xxxxⅹ软件| 国产一区二区在线观看免费| 亚洲人成网站精品片在线观看| 国产一区二区三区电影在线观看| 99精品热视频只有精品10| 亚洲国产高潮在线观看| 午夜精品999| 亚洲在线观看| 欧美日韩国产免费| 亚洲国产精品久久久久秋霞不卡 | 国产日韩欧美三区| 日韩视频在线观看免费| 亚洲国产三级| 久久偷窥视频| 久久久亚洲影院你懂的| 国产精品麻豆成人av电影艾秋| 亚洲高清在线观看| 亚洲高清在线精品| 免费观看成人| 欧美激情第8页| 亚洲国产日韩欧美在线动漫| 久久精品视频在线播放| 久久精品导航| 国产中文一区二区| 欧美专区日韩专区| 久久中文在线| 亚洲国产导航| 欧美大香线蕉线伊人久久国产精品| 欧美va亚洲va国产综合| 国产亚洲激情在线| 欧美在线综合视频| 另类亚洲自拍| 亚洲三级免费| 欧美三区在线| 亚洲欧美成人| 蜜桃久久精品一区二区| 亚洲国产老妈| 欧美日韩国产精品自在自线| 亚洲美女网站| 久久精品视频免费播放| 伊人影院久久| 欧美激情一区二区三区在线| 亚洲三级毛片| 午夜久久黄色| 尤物精品在线| 欧美日韩国产一区二区三区| 欧美日韩中文另类| 一区二区三区欧美| 国产精品久99| 亚洲综合日韩中文字幕v在线| 香蕉久久精品日日躁夜夜躁| 国产亚洲第一区| 老司机午夜精品视频| 亚洲电影在线看| 亚洲影院色在线观看免费| 国产精品日本精品| 久久精品一区四区| 91久久线看在观草草青青| 一区二区三区久久网| 国产欧美另类| 欧美激情bt| 午夜国产精品视频| 亚洲福利视频在线| 欧美亚洲在线观看| 亚洲国产片色| 国产欧美精品在线观看| 久久一区二区三区av| 一本色道久久88亚洲综合88| 久久蜜桃精品| 亚洲免费中文| 亚洲激情视频网| 国产精品一区二区三区久久| 嫩草国产精品入口| 午夜久久久久久久久久一区二区| 欧美成人免费全部| 欧美一二区视频| 亚洲无限av看| 亚洲精品影院| 亚洲福利在线看| 国产一区二区三区高清在线观看| 欧美日韩精品一区二区三区四区| 久久精品国产成人| 亚洲午夜激情网页| 亚洲另类黄色| 亚洲国产高清视频| 免费h精品视频在线播放| 欧美一区二视频在线免费观看| 99国产精品一区| 亚洲精品小视频| 亚洲成色精品|