int dfn[M],low[M],head[M],vis[M];
bool cut[M];
int e,n,cnt,root;
struct E
{
int to,nxt;
}edge[M*M];
void addedge (int cu,int cv)
{
edge[e].to = cv;
edge[e].nxt = head[cu];
head[cu] = e ++;
}
void dfs (int u,int father,int dep)
{
int son = 0;
vis[u] = 1;
dfn[u] = low[u] = dep;
for (int i = head[u];i != -1;i = edge[i].nxt)
{
int v = edge[i].to;
if (vis[v] == 1&&v != father)
low[u] = min (low[u],dfn[v]);
if (vis[v] == 0)
{
dfs (v,u,dep + 1);
son ++;
low[u] = min (low[u],low[v]);
if ((u == root && son > 1)||(u != root&&dfn[u] <= low[v]))
cut[u] = true;
//if (dfn(u) < low(v))
// bridge[k][0] = u;
// bridge[k++][1] = v; // (u,v) 为桥
}
}
vis[u] = 2;
}
int main ()
{
.......
root = 1;
dfs (root,-1,1);
int ans = 0;
for (int i = 1;i <= n;i ++)
if (cut[i])
ans ++;
......
......
}
割点 割边 模板
最新推荐文章于 2022-08-09 14:28:47 发布