网易笔试题-求有向连通图的割点

这篇博客探讨了有向图中割点的定义,割点存在两种情况:1. 根节点拥有两个或更多子树;2. 非叶节点的某节点,其子节点和后继节点无法回指到该节点的祖先。文中通过深度优先搜索建立搜索树,并利用visit[]和low[]数组来判断割点,但遇到去掉H点后图仍看似连通的疑问。
摘要由CSDN通过智能技术生成

首先,明白割点定义:如果去除此点,则有向图不再连通。割点的具体情况可以结合下面的图来分析:


可以看到,割点有两种情况(通过深度优先搜索树来遍历):

1.如果是根节点,且有大于或等于两个以上的子树,则为割点。

2.如果不是叶节点的某节点node(比如节点J,K是叶子节点,但他们不属于割点),对于node来说它的子结点及后继结点没有指向node的祖先的回边,则为割点。譬如图中的E结点,它不满足这个条件所以为割点。

在具体实现的时候用visit[]数组来存储结点的访问顺序,而用low[]数组来存储结点能访问到的最小的结点顺序号。假设对于结点node来说,如果它的后继结点的low[]不小于visit[node]的话,则为割点。程序如下所示:

#include <iostream>
#include <string>
using namespace std;

#define  MAX_NUM 20
int visit[MAX_NUM] = {0};//存储结点的访问顺序
int cuts[MAX_NUM]  = {0};//存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值