[割点] poj 1523 SPF

这篇博客详细介绍了如何解决POJ 1523题目,涉及割点检测和连通分量计算。通过深度优先搜索(DFS)策略,计算每个节点的low和dfn值,确定割点条件,并给出C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
[割点] poj 1523 SPF
求割点及去掉该割点后的连通分量个数。
dfn[] dfs产生的优先数
low[u] 从u或u的子孙出发通过回边可以到达的最低深度优先数
low[u] = min{dfn[u], min{low[w]|w是u的一个子女}, min{dfn[v]|v与u邻接且(u,v)是一条回边} }
顶点u是割点的充要条件是: u 或者 是具有两个以上子女的深度优先生成树的根,
或者虽不是一个根,但他有一个子女w使得low[w] >= dfn[u]
*/
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;

#define N 1001
vector<int> vec[N];
int low[N],dfn[N],subnet[N],vis[N];
int cnt,son,n;

void dfs(int u)
{
    for(int i = 0; i < vec[u].size(); ++i)
    {
        int v = vec[u][i];
        if(!vis[v])
        {
            vis[v] = 1;
            low[v] = dfn[v] = ++cnt;
            dfs(v);
            low[u] = min(low[v],low[u]);
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值