matlab學習 強連通分量

2021-08-19 18:41:17 字數 1703 閱讀 4214

最近motion graph相關實驗,發現實現運動過渡需要構建運**,而為了避免運動過渡陷入死胡同,需要對圖結構進行裁剪,方法就是計算圖模型的極大強聯通分量,但是自己懶得去實現,所以就去搜了一下matlab中有無相關實現,果然找到了。

國際慣例,參考**:

find strongly or weakly connected components in graph

建立稀疏矩陣

首先是建立圖結構,主要是利用sparse函式,直接看建立有向圖需要指定的資訊:

dg = sparse([111

2233

4567

7899

99], ...

[268

3142

5476

49810

53],true,10,10)

前兩個引數是維度相同的行向量,指定了圖結構的某兩個節點的連線,true的意思是這兩個節點具有有向連線,後面的(10,10)意思是總共有10個節點。比如上述就說明了如下節點間有有向連線:

(2,1)        1

(1,2) 1

(3,2) 1

(2,3) 1

(9,3) 1

(3,4) 1

(5,4) 1

(7,4) 1

(4,5) 1

(9,5) 1

(1,6) 1

(7,6) 1

(6,7) 1

(1,8) 1

(9,8) 1

(8,9) 1

(9,10) 1

也可以用biograph視覺化所構建的圖模型:

看著挺簡單的,直接使用sparse函式,指定某兩個節點之間的連線狀態即可。

尋找強連通分量的函式是graphconncomp,呼叫方法也很簡單,直接把sparse定義的圖結構丟進去:

[s,c] = graphconncomp(dg);
這裡得到了兩個輸出,s代表當前圖結構中具有多少個強連通分量,c分別指示了節點屬於第幾個強聯通分量,比如上圖的10個節點分屬的強聯通分量是4,4,4,1,1,2,2,4,4,3,也可以視覺化

%將強聯通分量標記出來

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

強連通分量

對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...

強連通分量

在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...