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

隨筆-80  評論-24  文章-0  trackbacks-0
有向圖強連通分支就是這樣一個最大的頂點集合C,其中的任意一對頂點u和v,u可達v,并且v可達u。
kosaraju算法是求有向圖強連通分支的有效算法。起基本思想就是兩次DFS,說起來簡單,但是如何證明其兩次DFS是能成功求出強連通分支的呢?
1、對圖G第一次DFS遍歷完成之后,會形成若干個DFS樹,它們組成森林,假設有C1,C2,C3...Ck棵DFS樹,而且遍歷完成時間C1<C2<C3<...<Ck,這樣,可知必然不存在從Ci到Cj的邊(其中i<j),因為如果存在Ci->Cj則假設這條邊是從Ci的x節點到Cj的y節點,則由白色路徑定理可知,必然存在一條從Ci到Cj的白色路徑,則Cj會是Ci的一棵子樹!所以不存在從Ci到Cj的邊(其中i<j)。
2、當把圖G的所有邊逆向之后,設形成圖F,則由1可知不存在從Cj到Ci的路徑,這樣,對圖F按照第一次DFS遍歷時各個節點的完成時間由大到小進行DFS遍歷,即從Ck的樹根r開始遍歷:首先根據前面的論證需要明確一個事實,r所在的強連通分支的點集必然屬于樹Ck,因為不存在從Ck到Ca(a<k)的邊,另外就是r到Ck中所有節點都是可達的,這樣當對圖G的逆圖F從r點開始遍歷的時候,所有可到達的點在圖G中都是可到達r的!這樣遍歷結果就是r所在的強連通分支!然后在從剩下沒有遍歷過的所有節點中第一次DFS的完成時間最大的點開始遍歷,因為剩下的點都為白色(可能會存在白色點指向從r形成的強連通分支的反向邊),所以與Ck的根r類似,同樣能形成一個強連通分支,這樣就能把Ck中的所有強連通分支找出,同樣可以找出Ck-1...C1中的強連通分支。
證畢!
證明如果能看懂的話那代碼就非常簡單了,下面是示例代碼:
 1 #include <cstdio>
 2 #include <vector>
 3 
 4 #define MAXN 105
 5 #define ROOT 0
 6 
 7 typedef struct {
 8   std::vector<int> adj_list;
 9 #define WHITE 0
10 #define GREY 1
11 #define BLACK 2
12   int color;
13 } GRAPH;
14 
15 GRAPH graph[MAXN];
16 GRAPH rgraph[MAXN];
17 int nr_of_nodes = 0;
18 int nr_of_edges = 0;
19 
20 static void init() {
21   int i;
22   for (i = 0; i < MAXN; ++i) {
23     graph[i].adj_list.clear();
24     graph[i].color = WHITE;
25     rgraph[i].adj_list.clear();
26     rgraph[i].color = WHITE;
27   }
28   nr_of_nodes = 0;
29   nr_of_edges = 0;
30 }
31 
32 static void input() {
33   int i, u, v;
34   freopen("input""r", stdin);
35   scanf("%d%d"&nr_of_nodes, &nr_of_edges);
36   for (i = 0; i < nr_of_edges; ++i) {
37     scanf("%d%d"&u, &v);
38     graph[u].adj_list.push_back(v);
39     rgraph[v].adj_list.push_back(u);
40   }
41 }
42 
43 static void DFS(GRAPH* g, int x, std::vector<int>* list) {
44   int i;
45   g[x].color = GREY;
46   for (i = 0; i < g[x].adj_list.size(); ++i) {
47     if (g[g[x].adj_list[i]].color == WHITE) {
48       DFS(g, g[x].adj_list[i], list);
49     }
50   }
51   g[x].color = BLACK;
52   list->push_back(x);
53 }
54 
55 static void strong_connected_components() {
56   int i, j;
57   std::vector<int> vertexes
58   std::vector<int> scc;
59   std::vector<std::vector<int> > sccs;
60 
61   for (i = 0; i < nr_of_nodes; ++i) {
62     if (graph[i].color == WHITE) {
63       DFS(graph, i, &vertexes);
64     }
65   }
66 
67   for (i = vertexes.size() - 1; i >= 0--i) {
68     if (rgraph[vertexes[i]].color == WHITE) {
69       DFS(rgraph, vertexes[i], &scc);
70       sccs.push_back(scc);
71       scc.clear();
72     }
73   }
74 
75   for (i = 0; i < sccs.size(); ++i) {
76     printf("strong connected component %d: ", i);
77     for (j = 0; j < sccs[i].size(); ++j) {
78       printf("%d ", sccs[i][j]);
79     }
80     printf("\n");
81   }
82 }
83 
84 int main(int argc, const char **argv) {
85   init();
86   input();
87   strong_connected_components();
88   return 0;
89 }
90 
91 

核心部分代碼就是strong_connected_components()和DFS()。這里利用一個棧來保存每個節點的完成先后順序,第二次遍歷的時候就按照最后完成的節點開始向前遍歷。
posted on 2012-08-22 21:28 myjfm 閱讀(1138) 評論(0)  編輯 收藏 引用 所屬分類: 算法基礎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一级在线亚洲天堂| 欧美精品久久一区| 免费成人黄色片| 久久亚洲美女| 久久这里只有| 欧美成人免费视频| 亚洲精品乱码| 亚洲精品中文字幕有码专区| 一区二区三区日韩精品视频| 亚洲天堂成人| 久久久国产成人精品| 欧美成人精品在线视频| 欧美精品一二三| 亚洲丰满在线| 一区二区三区产品免费精品久久75 | 欧美一级二级三级蜜桃| 午夜精品在线| 欧美精品一区二区三区蜜臀| 国产精品自拍小视频| 亚洲国产高清一区二区三区| 欧美一级在线播放| 一本一本久久a久久精品综合妖精| 欧美一级播放| 国产日韩欧美在线看| 一本大道久久精品懂色aⅴ| 美女精品在线观看| 精品成人一区二区三区| 日韩视频免费| 麻豆成人在线播放| 久久亚洲高清| 在线播放不卡| 欧美不卡一卡二卡免费版| 亚洲欧美一区二区在线观看| 欧美新色视频| 亚洲女女女同性video| 日韩视频精品| 国产精品爽黄69| 久久精品视频在线观看| 久久99伊人| 亚洲黄色在线视频| 亚洲精品免费一二三区| 欧美日韩国产页| 欧美视频精品一区| 久久成人免费电影| 久久久久天天天天| 亚洲精品精选| 亚洲字幕在线观看| 精品福利免费观看| 亚洲毛片在线看| 国产日韩亚洲欧美| 欧美国产先锋| 国产毛片精品国产一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 久久精品动漫| 欧美一区二区三区精品电影| 久久一区二区三区超碰国产精品| 日韩亚洲欧美综合| 午夜影视日本亚洲欧洲精品| 亚洲人成啪啪网站| 久久爱www久久做| 久久久久亚洲综合| 亚洲裸体在线观看| 久久国产精品一区二区三区四区| 亚洲伦理在线| 美女爽到呻吟久久久久| 久久精品一区蜜桃臀影院| 欧美日韩亚洲一区二区| 欧美黄色视屏| 亚洲三级电影在线观看 | 宅男在线国产精品| 日韩视频在线观看国产| 蜜臀av在线播放一区二区三区| 久久精品国产欧美激情| 国产欧美精品一区二区三区介绍 | 一区二区三区三区在线| 久久久久久免费| 一区二区三区国产| 欧美日韩精品免费在线观看视频| 亚洲成人自拍视频| 亚洲人成网在线播放| 欧美日韩国产另类不卡| 国产精品99久久久久久久vr | 久久免费高清| 亚洲第一色在线| 欧美日韩99| 亚洲欧美日本精品| 久色婷婷小香蕉久久| 亚洲精选一区| 国产亚洲综合在线| 欧美国产日韩一区二区| 国产精品一区二区在线观看不卡| 一本久久青青| 欧美激情第五页| 午夜一区在线| 亚洲美女av网站| 一区二区三区亚洲| 欧美午夜视频在线观看| 欧美sm视频| 久久高清福利视频| 亚洲专区一区| 在线中文字幕一区| 亚洲国产天堂久久综合| 久久激情视频| 欧美在线影院在线视频| 99在线精品免费视频九九视| 怡红院精品视频在线观看极品| 欧美性感一类影片在线播放 | 一区二区三区欧美日韩| 欧美高清视频在线播放| 久久精品久久综合| 欧美精品一区二区三区视频 | 一区二区精品在线| 最近中文字幕日韩精品 | 欧美一区亚洲二区| 亚洲一区日韩| 欧美中文在线视频| 欧美伊人久久大香线蕉综合69| 亚洲性感美女99在线| 亚洲一区999| 欧美亚洲一区二区三区| 久久久久久久久久码影片| 久久久久免费视频| 欧美日韩hd| 久久综合九色综合欧美狠狠| 欧美一级在线播放| 99视频一区二区| 一区二区高清在线| 久久精品女人天堂| 亚洲午夜久久久久久尤物| 欧美一级专区| 亚洲国产日韩在线一区模特| 亚洲午夜视频在线| 玖玖玖免费嫩草在线影院一区| 欧美精品在线免费| 极品尤物av久久免费看| 亚洲欧美日韩直播| 亚洲第一精品夜夜躁人人躁| 亚洲欧美在线磁力| 国产精品白丝jk黑袜喷水| 一区二区三区**美女毛片| 久久久999| 欧美在线日韩| 激情成人av| 欧美ab在线视频| 久久米奇亚洲| 伊人影院久久| 亚洲国产精品电影| 久久免费精品视频| 亚洲一区二区免费看| 国产精品成人观看视频免费| 亚洲特级毛片| 亚洲一区二区三区乱码aⅴ| 国产精品久久久久久久久动漫| 日韩视频在线你懂得| 亚洲免费福利视频| 欧美视频在线观看 亚洲欧| 亚洲欧美在线高清| 欧美一级片久久久久久久| 雨宫琴音一区二区在线| 亚洲承认在线| 国产精品久久一卡二卡| 午夜精品在线观看| 久久先锋影音| 亚洲欧美电影在线观看| 久久精品官网| 亚洲欧美第一页| 老巨人导航500精品| 亚洲午夜av在线| 久久精品中文字幕一区二区三区| 99精品国产在热久久| 欧美在线网站| 亚洲嫩草精品久久| 亚洲国产精品免费| 日韩一级二级三级| 亚洲国产婷婷香蕉久久久久久99| 亚洲国产精品专区久久| 国产麻豆精品视频| 日韩午夜激情| 一本大道久久a久久精品综合| 久久久久久欧美| 久久国产精品一区二区| 欧美日本国产精品| 亚洲福利免费| 亚洲精品久久嫩草网站秘色 | 一区二区日韩| 亚洲欧美三级在线| 国产精品区二区三区日本| 日韩视频一区| 亚洲欧美综合一区| 日韩午夜av在线| 久久国产精品电影| 亚洲欧美bt| 黄色日韩网站| 欧美成人a∨高清免费观看| 免费观看30秒视频久久| 亚洲精品国产精品国产自| 美女在线一区二区| 日韩视频在线一区| 久久久www成人免费毛片麻豆| 欧美视频在线一区|