首先,明白割点定义:如果去除此点,则有向图不再连通。割点的具体情况可以结合下面的图来分析:
可以看到,割点有两种情况(通过深度优先搜索树来遍历):
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};//存储