無向連通圖點雙連通分量
定義:
無向連通圖點雙連通分支是指不包含割點的極大連通子圖
割點可以屬於多個點雙連通分支,其餘點和每條邊只屬於且屬於一個點雙連通分支。
無重邊的無向連通圖點雙連通分支
//無重邊的無向連通圖點雙連通分支
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
const int N=200;
vector<int>g[N];
int dfn[N],low[N];
int index,n,m;//index編號 n點數 m邊數
struct Edge{
int u,v;
Edge(int u,int v):u(u),v(v){}
};
stack<Edge>s;
int t;
void Tarjan(int u,int father)//father是u的父節點
{
dfn[u]=low[u]=index++;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(!dfn[v]){//v沒有被訪問
//樹邊入棧
s.push(Edge(u,v));
Tarjan(v,u);
low[u]=min(low[u],low[v]);
Edge temp(0,0);
if(dfn[u]<=low[v]){
/*從一條邊往下走,走完後發現自己是割點,則棧中的邊一定全是和自己在一個雙
連通分量裡面,根節點總是和其下的某些點在同一個雙連通分量裡面
*/ cout<<"Block No:"<<++t<<endl;
do{
temp=s.top();
s.pop();
cout<<temp.u<<","<<temp.v<<endl;
}while(!(temp.u==u&&temp.v==v));
}
}
else if(father!=v){//連到父節點的回邊不考慮
low[u]=min(low[u],dfn[v]);
//連線到祖先的回邊要入棧,但是連線到兒子的邊,此處肯定已經入過棧了
if(dfn[u]>dfn[v])
s.push(Edge(u,v));
}
}
}
int main()
{
int u,v;
index=1;
cin>>n>>m;//點數 邊數
for(int i=1;i<=m;i++){
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
Tarjan(1,0);
return 0;
}
相關文章
- 無向連通圖邊雙連通分量
- 【筆記/模板】無向圖的雙連通分量筆記
- 無向連通圖求割點和橋
- 有向圖的連通性(判強連通)
- 有向圖的強連通分量 模版
- Tarjan 求有向圖的強連通分量
- Day8 雙連通分量
- 「學習筆記」雙連通分量、割點與橋筆記
- UVA-11504 - Dominos(有向圖的強連通分量)
- POJ 3694 Network 邊雙連通分量+LCA
- 最大半連通子圖
- SSL_1758【連通圖】
- 雙向連結串列 尾節點插入
- 【模板】tarjan 強連通分量縮點
- 連結串列-雙向連結串列
- 【演算法學習】tarjan 強連通、點雙、邊雙及其縮點 重磅來襲!!!!演算法
- UDP雙向通訊UDP
- 雙向連結串列
- 強連通分量
- 連結串列-雙向通用連結串列
- 連通圖與Tarjan演算法演算法
- 雙向通訊之websocketWeb
- 雙向通訊之SSE
- 連結串列-雙向非通用連結串列
- 圖論——強連通分量(Tarjan演算法)圖論演算法
- 1852 連通塊
- 019 通過連結串列學Rust之雙連結串列實現PeekRust
- 雙向連結串列————查詢、刪除、插入結點
- Docker網路雙向連線Docker
- 實現雙向連結串列
- Tarjan求強連通分量
- 2024-05-05 通達信選股 雙黃連
- 最小連通代價
- HTTPS連線建立過程(單向&雙向)HTTP
- 016 通過連結串列學習Rust之安全的雙連結串列佈局Rust
- Day7 割點、割邊和強連通分量
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- DoublyLinkedList(雙向連結串列)——Javascript版JavaScript