1. 程式人生 > >關於強連通分量的一些理解(tarjan版本)

關於強連通分量的一些理解(tarjan版本)

------------------------------------------概念部分----------------------------------------------------------------

強連通是在有向圖當中提出的概念,代表點點之間都可以互相達到

下面說幾個具體的概念:

頂點強連通:在有向圖G中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通(strongly connected)。

強連通圖:如果有向圖G的每兩個頂點都強連通,則稱G是一個強連通圖。

強連通分量:非強連通圖有向圖的極大強連通子圖,成為強連通分量(strongly connected components)。

---------------------------------------演算法部分-------------------------------------------------------------------- 

利用tarjan演算法求解強連通分量。

定義兩個陣列dfn[]和low[],dfn[]代表某個點的深搜序的時間戳,low[]代表當前點及其子樹中的點能夠直接連線到點的最小的時間戳。我們還需要一個棧去儲存每個被訪問到的點。low和dfn陣列的維護方法就是標準的tarjan演算法的維護方法。

那麼我們如何得到強連通分量呢?

當low[u] == dfn[u]的時候,證明u的子樹當中的點(包括它本身),不存在連向子樹以外的點,那麼也就是這個子樹當中的點是一個強連通分量。如果能夠連向子樹以外的點,那麼當前點能夠在深搜的路徑中到達,也可以通關過反向的這條邊返回這條邊,依舊保證了強連通的性質,當這種性質不存在的時候,那麼當前的連通子圖是最大的,也就是強連通分量。此時位置在棧的上面的點均是在當前子樹中的,那麼我們利用棧的性質,我們就能夠得到這個強連通分量當中所有的點

--------------------------------------程式碼模板部分------------------------------------------------------------------

這個模板是測過的,我保證..........

void tarjan ( int u )  
{  
    dfn[u] = low[u] = ++times;  
    mark[u] = 1;  
    s.push ( u );  
    int len = e[u].size();  
    for ( int i = 0 ; i < len ; i++ )  
    {  
        int v = e[u][i];  
        if ( !mark[v] )  
        {  
            tarjan ( v );  
            low[u] = min ( low[u] , low[v] );  
        }  
        if ( mark[v] == 1 )  
            low[u] = min ( low[u] , dfn[v] );  
    }  
    if ( dfn[u] == low[u] )  
    {  
        int temp;  
        do  
        {  
            temp = s.top();  
            b[temp] = cnt;  
            sum[cnt]++;  
            mark[temp] = 2;  
            s.pop();  
        }while ( temp != u );  
        cnt++;  
    }  
}  

----------------------------------------強連通分量的應用-----------------------------------------------------------------

對於一個有向圖,我們可以通過強連通分量得到一個DAG(有向無環圖),這種有很優良的性質,能夠進行拓撲排序,進行動態規劃等等。一般在演算法中作為預處理用到。

相關推薦

關於連通分量一些理解tarjan版本

------------------------------------------概念部分---------------------------------------------------------------- 強連通是在有向圖當中提出的概念,代表點點之間都可以互

連通分量及縮點tarjan演算法解析

http://blog.csdn.net/justlovetao/article/details/6673602 有向圖強連通分量的Tarjan演算法 [有向圖強連通分量]在有向圖G中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通,

#1185 : 連通性·三連通分量+縮點+拓撲排序

時間限制:10000ms單點時限:1000ms記憶體限制:256MB描述暑假到了!!小Hi和小Ho為了體驗生活,來到了住在大草原的約翰家。今天一大早,約翰因為有事要出去,就拜託小Hi和小Ho忙幫放牧。約翰家一共有N個草場,每個草場有容量為W[i]的牧草,N個草場之間有M條單向

Tarjan應用:求割點/橋/縮點/連通分量/雙連通分量/LCA(最近公共祖先)

應用 說明 lca ref father 無向圖 沒有 經理 遠的 本文轉載自:http://hi.baidu.com/lydrainbowcat/item/f8a5ac223e092b52c28d591c 作者提示:在閱讀本文之前,請確保您已經理解並掌握了基本的T

淺析連通分量Tarjan和kosaraju

logs 時間戳 code ongl 時間 完成 get tps alt 理解 在有向圖G中,如果兩點互相可達,則稱這兩個點強連通,如果G中任意兩點互相可達,則稱G是強連通圖。 定理: 1、一個有向圖是強連通的,當且僅當G中有一個回路,它至少包含每個節點一次。

POJ 1236 Network of Schoolstarjan連通分量+思維

一個 div http mes pos 全部 tde bre 一點 題目鏈接:http://poj.org/problem?id=1236 題目大意: 給你一個網絡(有向圖),有兩個任務: ①求出至少同時需要幾份副本可以使得整個網絡都獲得副本 ②至少添加多少信息表

Tarjan相關連通分量,割點,縮點

一、先上模板QWQ #include<bits/stdc++.h>//tarjan-強連通分量 using namespace std; const int MAXM=100005; const int MAXN=5005; int n,m,tot,head[MAXN],dfn[MAXN],l

tarjan演算法入門——有向圖的連通分量

一.概述. 強連通分量SCC是基於有向圖的一個概念,即“極大連通分量”.有向圖的強連通分量就是說一張圖G的子圖G',G'的每一個點u都可以遍歷到這張圖上的任意一個點v,且這張子圖G'極大,極大的意思可以參考雙連通分量的極大.   二.強連通分量與tarjan演算法. t

ACM模板——連通分量Tarjan

一、講解一 強連通定義:在有向圖G<V,E>中,對於點集V'∈V, 點集中的任意兩點都可達,則稱V'為強連通。 孤立的一個點也是一個強連通分量。 在巢狀的多個環時 : {所有環上的點}為一個強連通分量( 最小環就是每個孤立點)注意一定是滿足條件的最大點集

有向圖的連通分量tarjan演算法

強連通分量 有向圖強連通分量:在有向圖G中,如果兩個頂點vi,vj間(vi>vj)有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。有向

連通分量Korasaju、Tarjan

一.基本概念     1.橋:是存在於無向圖中的這樣的一條邊,如果去掉這一條邊,那麼整張無向圖會分為兩部分,這樣的一條邊稱為橋無向連通圖中,如果刪除某邊後,圖變成不連通,則稱該邊為橋。     2.割點:無向連通圖中,如果刪除某點後,圖變成不連通,則稱該點為割點。 二:tarjan演算法在求橋和割點中的應用

B - Network of Schools POJ - 1236Tarjan連通分量+縮點

題目連結 題意: 給出你一個圖,代表許多學校的網路連線情況,第一個問題:要想把一個資訊傳輸到所有節點至少要在幾個節點上放置資訊。第二個問題:想要把整個圖變成強連通圖需要增加多少條邊。 思路: 對於第一個問題,找到所有的強連通分量,然後把其縮成一個點,然後再看整個

Popular Cows POJ - 2186 Tarjan連通分量 + 縮點

Every cow’s dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <=

tarjan連通分量+縮點+割點/割橋點雙/邊雙

 轉載自 這裡 一、tarjan求強連通分量 1、什麼是強連通分量? 引用來自度孃的一句話: “有向圖強連通分量:在有向圖G中,如果兩個頂點vi,vj間(vi>vj)有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通(str

tarjan連通分量+縮點+割點以及一些證明

#include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namesp

POJ 2553 The Bottom of a Graph連通分量

margin target 代碼 not push ret dsm ng- http POJ 2553 The Bottom of a Graph 題目鏈接 題意:給定一個有向圖,求出度為0的強連通分量 思路:縮點搞就可以 代碼: #include <

hdu 3836 Equivalent Sets連通分量--加邊

accep nod ons first pan val while 無環 mono Equivalent Sets Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857

連通分量——消息擴散(洛谷_2002)——tarjan求scc

cnblogs color line include std else print pac 強連通分量 強連通分量(scc) 縮點 建新圖 找入度為0的點 大功告成 #include<iostream> #include<cstdio> #incl

連通分量——愛在心中(codevs_2822)——tarjan求scc

vector 連通 答案 建圖 getchar urn div 標記 while scc 找只有一個節點的強連通分量,標記。 第一行輸出強連通分量個數(不為1個節點) 縮點 建圖 找出度為0的點。 超過一個或者該點被標記,puts(“-1”); else 輸出答案。 #i

tarjan 算法求連通分量

n) 後繼節點 memset eof cnblogs hide open vector space 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e4+5; 4 int