Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
lowlink.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2
3/// @brief 橋と関節点の情報
4struct BridgeInfo {
5 vector<pair<int,int>> bridge; ///< 橋
6 vector<int> articulation; ///< 関節点
7};
8
9/// @brief Low Link のアルゴリズムによりグラフGの橋と関節点を求める
10/// @note O(V+E)
11BridgeInfo LowLink(const vector<vector<int>>& g) {
12 int n=g.size();
13 vector<int> ord(n,-1),low(n,-1),articulation,seen(n,false);
14 vector<pair<int,int>> bridge;
15
16 auto dfs=[&](auto&& dfs, int now, int pre, int& cnt)-> void {
17 seen[now]=true; ord[now]=low[now]=cnt++;
18 bool is_articulation=false;
19 int child=0;
20 for(int nxt: g[now]) {
21 if(!seen[nxt]) {
22 child++;
23 dfs(dfs,nxt,now,cnt);
24 low[now]=min(low[now],low[nxt]);
25 if(pre!=-1 && ord[now]<=low[nxt]) is_articulation=true;
26 if(ord[now]<low[nxt]) bridge.push_back(minmax(now,nxt));
27 }
28 else if(nxt!=pre) low[now]=min(low[now],ord[nxt]);
29 }
30 if(pre==-1 && child>1) is_articulation=true;
31 if(is_articulation) articulation.push_back(now);
32 };
33
34 int cnt=0;
35 for(int i=0; i<n; i++) if(!seen[i]) dfs(dfs,i,-1,cnt);
36 sort(bridge.begin(),bridge.end());
37 sort(articulation.begin(),articulation.end());
38 return {bridge,articulation};
39}
橋と関節点の情報
Definition lowlink.hpp:4
vector< int > articulation
関節点
Definition lowlink.hpp:6
vector< pair< int, int > > bridge
Definition lowlink.hpp:5