无向图的割顶:
Vector <int> G[] :邻接表存图
Int pre[] :存储时间戳
Int low[] : u及其后代所能连回的最早的祖先的pre值
Int iscut[] : =true表示是割顶,=false不是割顶
Dfs函数在主函数调用时,fa预设为-1。
vector <int> G[MAXN]; int pre[MAXN],iscut[MAXN],low[MAXN],dfs_clock; int dfs(int u,int fa) { int lowu=pre[u]=++dfs_clock; int child=0; for (int i=0;i<G[u].size();i++) { int v=G[u][i]; if (!pre[v]) { child++; int lowv=dfs(v,u); lowu=min(lowu,lowv); if (lowv>=pre[u])//如果求桥,去掉等于号 { iscut[u]=true; } }else if (pre[v]<pre[u] && v!=fa) { lowu=min(lowu,pre[v]); } } if (fa<0 && child==1) iscut[u]=0; return low[u]=lowu; }
时间: 2024-10-14 11:14:56