1. 程式人生 > >Tarjan三大演算法之強連通分量

Tarjan三大演算法之強連通分量

簡介:
在之前的兩篇部落格中,我們詳細介紹了Tarjan大牛發明的用來求解割點、橋雙連通分量的演算法,這次我們介紹一下強連通分量

演算法:
這次的Tarjan演算法,可以用一次DFS把所有強連通分量找出來,依舊是用兩個時間戳和棧來實現。演算法的大體思路還是在深搜過程中更新時間戳,並將遍歷過的結點儲存在棧中,之後通過對時間戳的判斷,來發現強連通分量。當我們完成對一個結點u以及其子孫的訪問後,我們可以進行一次時間戳判斷,即是否low[u]與dfn[u]相等,如果相等,則發現了一個強連通分量。因為low[u]代表結點u能訪問到的最早結點時間,如果和dfn[u]一樣,那麼說明這是整個強連通分量裡最早被訪問的結點,於是將結點出棧可以找到整個強連通分量。

程式碼:

int n,m,dfn[100005],low[100005],stamp;
int scnt,stack[100005],scc,vis[100005],num[100005];
bool instack[100005];
vector<int> vec[100005];        // 為保證效率可能需要自己實現vector 

void tarjan(int index)
{
    int tmp;
    dfn[index]=low[index]=++stamp;
    instack[index]=1, stack[++scnt]=index;
    for(int i=0;i<vec[index].size();i++)
    {
        tmp=vec[index][i];
        if
(!dfn[tmp]) { tarjan(tmp); low[index]=min(low[index],low[tmp]); } else if(instack[tmp]) { low[index]=min(low[index],dfn[tmp]); } } if(dfn[index]==low[index]) { scc++; do{ tmp=stack
[scnt--]; instack[tmp]=false; vis[tmp]=scc,num[scc]++; } while(tmp!=index); } } void find_scc(){ stamp=scc=scnt=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(instack,0,sizeof(instack)); for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); }

相關推薦

Tarjan三大演算法連通分量

簡介: 在之前的兩篇部落格中,我們詳細介紹了Tarjan大牛發明的用來求解割點、橋和雙連通分量的演算法,這次我們介紹一下強連通分量。 演算法: 這次的Tarjan演算法,可以用一次DFS把所有強連通分量找出來,依舊是用兩個時間戳和棧來實現。演算法的大體思路

Tarjan三大演算法連通分量(雙連通分量

定義: 對於一個連通圖,如果任意兩點至少存在兩條點不重複路徑,則稱這個圖為點雙連通的(簡稱雙連通);如果任意兩點至少存在兩條邊不重複路徑,則稱該圖為邊雙連通的。點雙連通圖的定義等價於任意兩條邊都同在一個簡單環中,而邊雙連通圖的定義等價於任意一條邊至少在一個簡單

Tarjan演算法三大應用連通分量

Tarjan是一個對圖的分析的強有力的演算法,主要應用有:有向圖的強連通分量、無向圖的割點橋與雙連通分量、LCA(最近公共祖先) 基本概念 下面主要介紹tarjan演算法在強連通分量中的應用。 首先我們需要知道強連通是有向圖特有的概念,如果一個有向圖中

Tarjan演算法三大應用連通分量

基本概念 定義1: 割點集合:點集V′∈V,若G刪除了V′後不連通,但刪除了V′的任意真子集後G仍然連通,則稱V′為割點集合 割點:若某一結點就構成了割點集合,那麼稱此結點為割點或

HDU1269迷宮城堡------------------用Tarjan演算法計算連通分量

Problem Description  為了訓練小希的方向感,Gardon建立了一座大城堡,裡面有N個房間(N<=10000)和M條通道(M<=100000),每個通道都是單向的,就是說若稱某通道連通了A房間和B房間,只說明可以通過這個通道由A房間到達B房間,但並不說明通過它

Tarjan演算法-求連通分量入門

Tarjan演算法求強連通分量,強連通分量就是有向圖(可以是子圖)中的任意兩點都能互相到達,所以我們可以用Tarjan演算法去求出所有的強連通分量,相當於縮點,然後把這些縮點連線起來,就是DAG(有向無環圖),DAG一定有一個點是出度為0的,可以嘗試畫畫圖。#include

20行程式碼實現,使用Tarjan演算法求解連通分量

今天是演算法資料結構專題的第36篇文章,我們一起來繼續聊聊強連通分量分解的演算法。 在上一篇文章當中我們分享了強連通分量分解的一個經典演算法Kosaraju演算法,它的核心原理是通過將圖翻轉,以及兩次遞迴來實現。今天介紹的演算法名叫Tarjan,同樣是一個很奇怪的名字,奇怪就對了,這也是以人名命名的。和Kos

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

Tarjan算法【連通分量

HR 得出 強連通 遍歷 str 時間復雜度 滿足 ack ID 轉自:byvoid:有向圖強連通分量的Tarjan算法 Tarjan算法是基於對圖深度優先搜索的算法,每個強連通分量為搜索樹中的一棵子樹。搜索時,把當前搜索樹中未處理的節點加入一個堆棧,回溯時可以判斷棧頂到

【算法】Tarjan算法求連通分量

標記 我們 else if show tar ans stk oid 入棧 概念: 在有向圖G中,如果兩個定點u可以到達v,並且v也可以到達u,那麽我們稱這兩個定點強連通。 如果有向圖G的任意兩個頂點都是強連通的,那麽我們稱G是一個強連通圖。 一個有向圖中的最大強連通子圖

POJ 2186 Popular Cows(圖論連通分量

強連通分量之於有向圖,與並查集之於無向圖,在概念上極其相似,都是尋找互相聯絡的小部分內容。 POJ 2186 Popular Cows Description Every cow's dream is to become the most popular cow in the herd.

UVA1327 && POJ1904 King's Quest(tarjan+巧妙建圖+連通分量+縮點)

UVA1327 King's Quest POJ1904 King's Quest 題意: 有n個王子,每個王子都有k個喜歡的妹子,每個王子只能和喜歡的妹子結婚。現有一個匹配表,將每個王子都與一個自己喜歡的妹子配對。請你根據這個表得出每個王子可以和幾個自己喜歡的妹子結婚,按序號升序輸出妹子的編號,這個表應

Tarjan演算法連通分量

最近又學習了強連通分量的Tarjan求法,先是看了別人的許多部落格,才勉勉強強看懂,自己寫完部落格後感到十分顯然,也沒有表面上看的那麼高大上。 好了,轉入正題,先說說什麼是強連通分量: 有向圖強連通分量:在有向圖G中,如果兩個頂點vi,vj間(vi>vj)有一條從v

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

描述: To prove two sets A and B are equivalent, we can first prove A is a subset of B, and then prove B is a subset of A, so finally we go

連通連通圖、連通分量 Tarjan演算法

一、解釋 在有向圖G中,如果兩個頂點間至少存在一條互相可達路徑,稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量(strongly connecte

Tarjan三大算法連通分量(雙連通分量) (轉載)

進行 ack clear 例題 min 路徑 ace 相關 重復 定義: 對於一個連通圖,如果任意兩點至少存在兩條點不重復路徑,則稱這個圖為點雙連通的(簡稱雙連通);如果任意兩點至少存在兩條邊不重復路徑,則稱該圖為邊雙連通的。點雙連通圖的定義等價於任意兩條邊都同在一個簡單

連通連通圖、連通分量 Tarjan算法

The 當前 one 自身 com name cxf 單個 con 原文地址:https://blog.csdn.net/qq_16234613/article/details/77431043 一、解釋 在有向圖G中,如果兩個頂點間至少存在一條互相可達路徑,稱兩個頂點強連

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

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

HDU1269 連通分量-tarjan演算法

題意就是在給定一個圖的情況下,問這個單向圖是不是強連通圖。 強連通圖的意思就是圖中任何一個點都可以到達另一個點。 分析:這道題是tarjan演算法求強連通分量的模板題,對於tarjan演算法求連通分

演算法模板】Tarjan連通分量

#include<iostream> #include<cstring> #include<stack> #include<vector> using namespace std; const int MAXN=1000+1