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

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>
            国产精品自在欧美一区| 欧美日韩不卡| 136国产福利精品导航网址应用| 欧美一区二区三区免费视| 午夜精品福利在线| 国外成人性视频| 欧美日韩色婷婷| 欧美日韩精品欧美日韩精品一 | 久久综合五月天婷婷伊人| 欧美+日本+国产+在线a∨观看| 这里只有视频精品| 欧美日韩情趣电影| 亚洲欧美在线磁力| 欧美一级视频免费在线观看| 国产免费成人在线视频| 老司机精品视频网站| 欧美精品导航| 卡通动漫国产精品| 欧美二区在线| 久久综合九色综合欧美就去吻| 亚欧成人精品| 91久久国产综合久久| 亚洲自拍三区| 亚洲午夜免费视频| 欧美aaa级| 免费成人av在线| 欧美日韩国产a| 亚洲成人在线网站| 国产欧美一区二区色老头| 91久久嫩草影院一区二区| 欧美日韩在线三级| 欧美成人福利视频| 伊人成年综合电影网| 久久精品亚洲一区二区| 久久爱www久久做| 国产综合婷婷| 久久久国产午夜精品| 米奇777超碰欧美日韩亚洲| 国产一区二区三区四区五区美女| 亚洲欧美日韩精品| 久久久久久久一区二区| 国产一区二区三区视频在线观看| 在线一区亚洲| 久久综合伊人77777| 1024成人网色www| 欧美精品二区三区四区免费看视频| 亚洲日本免费电影| 亚洲欧美日韩一区二区三区在线| 国产精品亚洲а∨天堂免在线| 午夜精品三级视频福利| 久久先锋影音| 国产精品国产三级国产aⅴ入口| 久久精品国产一区二区三区| 亚洲午夜一区| 国产精品一区二区在线观看不卡| 久久国产加勒比精品无码| 亚洲盗摄视频| 欧美中文日韩| 亚洲图片在区色| 亚洲激情影院| 国内精品视频在线观看| 亚洲激情在线| 在线观看视频一区二区欧美日韩 | 美女露胸一区二区三区| 亚洲精品在线观| 亚洲第一在线综合网站| 欧美激情一区三区| 亚洲欧美日韩中文在线制服| 亚洲国产一区二区三区a毛片| 小嫩嫩精品导航| 久久精品成人一区二区三区| 亚洲一区二区在线免费观看视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 黄色成人在线免费| 免费欧美在线视频| 亚洲高清在线精品| 久久久中精品2020中文| 在线观看日韩av| 国产精品一区一区三区| 久色成人在线| 亚洲成人直播| 久久久夜夜夜| 亚洲电影欧美电影有声小说| 亚洲欧美一区二区三区极速播放| 国产一区二区高清| 欧美日韩一区二区三区免费| 久久久久久久久久久久久9999| 亚洲一区制服诱惑| 99国产精品私拍| 亚洲国产日韩欧美在线图片| 久久偷窥视频| 久久久国产成人精品| 亚洲欧美清纯在线制服| 老司机一区二区| 久久久99精品免费观看不卡| 亚洲视频在线看| 亚洲小视频在线观看| 99re热精品| 亚洲女同性videos| 国产亚洲亚洲| 久久亚洲捆绑美女| 欧美国产精品久久| 欧美精品一区二区三区一线天视频| 国产日韩综合| 精品不卡在线| 99国产精品久久| 亚洲男女自偷自拍| 久久精品免费观看| 亚洲国产精品va在线看黑人 | 亚洲精品一区二区三区不| 欧美激情精品久久久久久黑人| 亚洲精品国产精品乱码不99| 久久色在线播放| 99国产欧美久久久精品| 先锋a资源在线看亚洲| 欧美成人资源| 国产一区久久久| 亚洲一区二区动漫| 亚洲国产婷婷综合在线精品 | 国产视频精品xxxx| 日韩一区二区免费看| 欧美日韩爆操| 亚洲精品久久久久久久久| 久久精品夜色噜噜亚洲a∨| 亚洲天堂成人在线视频| 亚洲丶国产丶欧美一区二区三区| 香蕉成人久久| 午夜精品理论片| 国产精品激情| 一区免费观看视频| 免费在线看一区| 亚洲夜间福利| 欧美性做爰毛片| 亚洲无限av看| 午夜精品美女久久久久av福利| 国产精品久久久久久久久久免费看 | 日韩视频在线观看| 亚洲一线二线三线久久久| 一区二区三区不卡视频在线观看| 欧美日韩高清在线播放| 亚洲欧美日韩精品久久亚洲区| 一区二区欧美在线| 欧美高清视频一二三区| 正在播放亚洲一区| 亚洲免费在线观看| 国外成人在线视频网站| 欧美激情第六页| 欧美国产综合| 久久黄色小说| 欧美a级一区二区| 久久精品导航| 欧美成人精品在线观看| 在线视频中文亚洲| 欧美ed2k| 国语精品中文字幕| 亚洲欧美日韩国产中文| 日韩视频免费在线| 欧美在线观看一区二区| 亚洲一区二区三区欧美| 欧美成人r级一区二区三区| 亚洲综合国产激情另类一区| 亚洲一区欧美激情| 亚洲欧美一区二区原创| 欧美精品日韩精品| 欧美a级一区二区| 在线电影国产精品| 久久9热精品视频| 亚洲欧洲日韩综合二区| 欧美一区二区三区在| 悠悠资源网亚洲青| 久久久精彩视频| 欧美伦理视频网站| 99视频在线精品国自产拍免费观看 | 99精品国产在热久久婷婷| 亚洲欧美区自拍先锋| 欧美日韩国语| 亚洲欧美日本国产有色| 久久久天天操| 欧美99在线视频观看| 亚洲国产精品va在看黑人| 欧美一区二区三区视频| 欧美aⅴ一区二区三区视频| 亚洲精品美女| 国产精品视频午夜| 久久久久久久久久看片| 久久国产精品黑丝| 激情婷婷亚洲| 国产精品久久777777毛茸茸| 免费亚洲电影在线| 亚洲视频一二区| 欧美二区视频| 亚洲欧美第一页| 最新成人av在线| 亚洲精品一线二线三线无人区| 国产精品久久久久久亚洲毛片 | 亚洲视频在线一区观看| 免费亚洲一区二区| 久久大香伊蕉在人线观看热2| 日韩视频一区二区在线观看| 国产精品乱码久久久久久|