使用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 當前節點為樹根的時候,條件是 要有多餘一棵子樹 ...