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

O(1) 的小樂

Job Hunting

公告

記錄我的生活和工作。。。
<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

統計

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

留言簿(10)

隨筆分類(70)

隨筆檔案(182)

文章檔案(1)

如影隨形

搜索

  •  

最新隨筆

最新評論

閱讀排行榜

評論排行榜

有向圖強連通分量 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.

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

算法偽代碼

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搜索的時候的入隊序列,Each time that depth-first search finishes expanding a vertex u, push u onto S.只有當擴展結束了此節點之后,此節點才會被push onto S.

算法思路:

1, 后序遍歷原圖,對每個訪問到的節點標記時間戳。

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

證明是很簡單的:

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

 

QQ截圖未命名

如果應用我們第一個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];                 //遍歷數組
int post[M];                 //時間戳對應的點
int timestamp;               //時間戳
int ComponetNumber=0;        //有向圖強連通分量個數
vector <int> Edge[M];        //鄰接表表示
vector <int> Opp[M];         //原圖的反圖
vector <int> Component[M];   //獲得強連通分量結果

void dfs(int u) {             //第一個dfs確定時間戳
    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--) {//按時間戳從大到小搜
        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;
}

 

 

    此算法的時間復雜度當然也是 O(M+N)(M條邊,N個點)與Tarjan算法相似。。但是在系數上不如Tarjan算法!在實際的測試中,Tarjan算法的運行效率也比Kosaraju算法高30%左右。 

    當然Kosaraju算法額外花費的時間,也不是白費的,它獲得了圖的一個拓撲性質哦!!

    如果我們把求出來的每個強連通分量收縮成一個點,并且用求出每個強連通分量的順序來標記收縮后的節點,那么這個順序其 實就是強連通分量收縮成點后形成的有向無環圖的拓撲序列。為什么呢?首先,應該明確搜索后的圖一定是有向無環圖呢?廢話,如果還有環,那么環上的頂點對應 的所有原來圖上的頂點構成一個強連通分量,而不是構成環上那么多點對應的獨自的強連通分量了。然后就是為什么是拓撲序列,我們在改進分析的時候,不是先選 的樹不會連通到其他樹上(對于反圖GT來說),也就是后選的樹沒有連通到先選的樹,也即先出現的強連通分量收縮的點只能指向后出現的強連通分量收縮的點。那么拓撲序列不是理所當然的嗎?這就是Kosaraju算法的一個隱藏性質。

 

Reference :

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

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

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

評論

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

樓主的第一次post數組是不是存錯了呢
  回復  更多評論    
統計系統
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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在线| 亚洲精品久久久蜜桃| 亚洲片国产一区一级在线观看| 亚洲成色www久久网站| 亚洲国产成人在线播放| 亚洲国产婷婷香蕉久久久久久| 在线观看亚洲视频| 99精品视频免费全部在线| 亚洲一区视频在线| 久久成人18免费网站| 久久人人九九| 91久久国产精品91久久性色| 91久久黄色| 亚洲视频大全| 久久婷婷国产综合国色天香| 欧美国产日本在线| 国产麻豆精品theporn| 91久久久精品| 午夜性色一区二区三区免费视频| 久久人91精品久久久久久不卡| 亚洲国产影院| 午夜欧美不卡精品aaaaa| 美女精品国产| 国产欧美日韩不卡| 亚洲精品在线电影| 欧美 日韩 国产在线| 国产女主播一区二区| 一区二区三区在线看| 99国产精品久久久久久久成人热| 午夜精品久久久久久| 欧美成人在线影院| 亚洲视频自拍偷拍| 欧美成人亚洲成人| 韩日精品在线| 欧美一区二区三区在线观看| 亚洲全部视频| 老司机免费视频一区二区| 国产精品久久国产愉拍 | 亚洲国产欧美一区二区三区久久| 亚洲永久网站| 欧美日韩精品久久久| 亚洲第一在线视频| 欧美一区国产二区| 一区二区三区欧美视频| 欧美激情a∨在线视频播放| 国产亚洲欧美日韩在线一区| 亚洲一区一卡| 亚洲伦理在线免费看| 乱中年女人伦av一区二区| 国产一区二区在线免费观看| 亚洲午夜女主播在线直播| 欧美国产第二页| 久久精品女人的天堂av| 国产婷婷成人久久av免费高清| 一本久道久久久| 91久久精品日日躁夜夜躁国产| 久久久一本精品99久久精品66| 国产乱码精品一区二区三区av| avtt综合网| 亚洲精品乱码久久久久| 欧美激情在线狂野欧美精品| 亚洲欧洲日产国产网站| 欧美福利影院| 欧美黄色一级视频| 99亚洲视频| 日韩一级大片| 国产精品久线观看视频| 亚洲欧美成人| 亚洲自拍另类| 国产一区二区三区久久久| 久久精品一区二区三区不卡| 欧美在线免费视屏| 亚洲国产日韩欧美一区二区三区| 欧美成年人网站| 蜜桃av一区二区三区| 亚洲每日更新| 亚洲午夜精品久久久久久浪潮| 国产精品一区一区| 久久久久久网址| 美女精品在线| 亚洲午夜电影网| 午夜精品久久久久久久| 韩日在线一区| 香蕉成人伊视频在线观看| 欧美成人免费va影院高清| 亚洲欧洲一级| 一本色道久久综合亚洲精品按摩| 国产精品久久久久久久久婷婷| 欧美在线网站| 久久躁狠狠躁夜夜爽| 一区二区三区高清不卡| 亚洲欧美日韩第一区| 伊人精品在线| 一区二区精品| 亚洲第一在线综合在线| 日韩午夜中文字幕| 黄页网站一区| 妖精视频成人观看www| 黄色亚洲网站| 一区二区激情| 亚洲高清视频中文字幕| 在线中文字幕一区| 亚洲国产91色在线| 亚洲欧美日韩一区二区在线 | 国精品一区二区三区| 亚洲电影第1页| 国产日韩高清一区二区三区在线| 亚洲第一福利社区| 国产一区二区毛片| 亚洲精品日韩综合观看成人91| 国产精品久久久久久久久久久久久| 蜜月aⅴ免费一区二区三区| 欧美性猛交xxxx乱大交退制版 | 国产字幕视频一区二区| 亚洲精品美女91| 在线观看中文字幕不卡| 亚洲综合清纯丝袜自拍| 一区二区精品在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 性色av香蕉一区二区| 欧美另类女人| 亚洲国产精品成人综合色在线婷婷| 国产欧美日韩在线| 亚洲天堂av在线免费观看| 日韩网站在线| 欧美国产日韩一区二区| 欧美福利一区二区三区| 在线观看日韩一区| 久久久之久亚州精品露出| 久久九九免费视频| 国产日韩综合一区二区性色av| 亚洲视频网在线直播| 亚洲免费一级电影| 国产精品乱人伦中文| 亚洲一区二区三区在线观看视频| 一区二区激情| 欧美性久久久| 亚洲欧美日韩精品| 久久久国产午夜精品| 国产视频久久| 久久国产色av| 免费在线观看精品| 亚洲黄色成人| 欧美久久精品午夜青青大伊人| 亚洲欧洲在线看| 日韩一级精品| 一区二区三区产品免费精品久久75 | 欧美一区二区三区的| 久久精精品视频| 国产一区99| 久久久久久婷| 亚洲精品影院在线观看| 99热这里只有成人精品国产| 欧美精品三级日韩久久| 亚洲另类一区二区| 欧美一区二区成人6969| 国内精品久久久久久久97牛牛| 久久综合影音| 亚洲人永久免费| 午夜在线播放视频欧美| 精品不卡一区二区三区| 欧美激情精品久久久久久黑人| 99re8这里有精品热视频免费 | 亚洲成色精品| 一区二区三区国产精品| 国产精品五区| 欧美成人嫩草网站| 亚洲女同精品视频| 欧美成人午夜激情在线| 国产精品99久久久久久久vr| 国产亚洲精品bt天堂精选| 久久裸体视频| 中文久久精品| 欧美国产第一页| 亚洲欧美激情诱惑| 亚洲大胆女人| 国产精品免费一区二区三区在线观看| 新狼窝色av性久久久久久| 亚洲国产成人高清精品| 欧美一区2区三区4区公司二百 | 亚洲精品少妇30p| 国产精品免费一区豆花| 美女国产精品| 欧美亚洲色图校园春色| 最近看过的日韩成人| 久久精品一区二区三区不卡| 99国产精品国产精品久久| 国产日韩欧美视频在线| 欧美日韩国产欧| 玖玖在线精品| 亚洲欧美中文在线视频| 亚洲精品偷拍| 欧美激情偷拍| 巨乳诱惑日韩免费av| 午夜精品短视频| 99re6这里只有精品| 影音先锋亚洲电影| 国产一级揄自揄精品视频|