割點和橋 Tarjan演算法

2021-06-24 11:33:09 字數 1061 閱讀 5239

使用tarjan演算法求解圖的割點和橋。

1、割點

主要的演算法結構就是dfs,乙個點是割點,當且僅當以下兩種情況:

(1)該節點是根節點,且有兩棵以上的子樹;

(2)該節點的任一子節點,沒有到該節點祖先的反向邊(就是說如果沒有這個割點,那麼這個子節點和那個祖先之間不連通);

void cutpoint_tarjan(int u,int parent)

else if(son != parent) //有後向邊

ptr=ptr->next;

}}

2、橋

tarjan演算法求割邊(橋):

使用(son!=parent && dfn[son]

void init_tarjan(void)

num_bridge=0;

for(int j=0;je;j++) }

void add_to_bnode(int front,int rear) //從座標1開始儲存

void bridgenode_tarjan(int u,int parent)

}else if(son != parent)

}ptr=ptr->next;

}}

為每一條邊標號 id

記錄每條邊(一條無向邊拆成的兩條有向邊id相同),每個點的父親到它的邊的標號;

//結點定義  /*****注意邊表節點定義有所變化****/

typedef struct edge_nodeenode;

void init_tarjan(void)  //tarjan演算法初始化

count_bridge=0;

for(int j=1;j<=alg->e;j++) //取值於1-e

bridge[j]=0;

}void bridge_tarjan(int u,int id) //id是u的父親邊的編號

}else

}ptr=ptr->next;

}}

Tarjan演算法求橋和割點

預備定義 low u 定義為u或者u的子樹中能夠通過 非父子邊 追溯到的最早的節點的dfs開始時間 d u 表示dfs過程中u的進棧時間 割點 無向連通圖中,如果刪除某點後,圖變成不連通,則稱該點為割點。橋 無向連通圖中,如果刪除某邊後,圖變成不連通,則稱該邊為橋。判斷割點方法 1 u為樹根,且u有...

tarjan求割點和橋(割邊)

tarjan求割點和橋 例題 割點 重要的地方在 中都有注釋 include define ll long long using namespace std const ll m 2e4 10,maxn 3e6 30 int dfn m low m tot int e m 1 k,p m k2 ve...

Tarjan求割點 橋

概念 1.橋 是存在於無向圖中的這樣的一條邊,如果去掉這一條邊,那麼整張無向圖會分為兩部分,這樣的一條邊稱為橋無向連通圖中,如果刪除某邊後,圖變成不連通,則稱該邊為橋。2.割點 無向連通圖中,如果刪除某點後,圖變成不連通,則稱該點為割點。割點特點 1 當前節點為樹根的時候,條件是 要有多餘一棵子樹 ...