13 vector<
int> ord(n,-1),low(n,-1),articulation,seen(n,
false);
14 vector<pair<
int,
int>> bridge;
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;
20 for(
int nxt: g[now]) {
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));
28 else if(nxt!=pre) low[now]=min(low[now],ord[nxt]);
30 if(pre==-1 && child>1) is_articulation=
true;
31 if(is_articulation) articulation.push_back(now);
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};