求无向图的割点和桥(模版)(训练指南)
割点:
int n; vector<int> G[maxn]; int pre[maxn],low[maxn]; int dfs_clock; bool iscut[maxn]; void init() { MS0(pre);MS0(iscut); dfs_clock=0; } int dfs(int u,int f) /// 调用:dfs(rt,0) { int lowu=pre[u]=++dfs_clock; int child=0; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(u==f) continue; if(!pre[v]){ child++; lowu=min(lowu,dfs(v,u)); if(low[v]>=pre[u]) iscut[u]=1; } else if(pre[v]<pre[u]) lowu=min(lowu,pre[v]); } if(f==0&&child==1) iscut[u]=0; return low[u]=lowu; }
桥:
int n; vector<int> G[maxn]; int pre[maxn],low[maxn]; int dfs_clock; struct Edge { int u,v; };vector<Edge> bridge; void init() { MS0(pre); dfs_clock=0; bridge.clear(); } int dfs(int u,int f) /// 调用:dfs(rt,0) { int lowu=pre[u]=++dfs_clock; int child=0; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(u==f) continue; if(!pre[v]){ lowu=min(lowu,dfs(v,u)); if(low[v]>pre[u]) bridge.push_back({u,v}); } else if(pre[v]<pre[u]) lowu=min(lowu,pre[v]); } return low[u]=lowu; }
没有AC不了的题,只有不努力的ACMER!