割点

深度优先生成树
对于无向图,处理边(v, w)时,若w未被访问过则将v->w作为树的一条边,否则将v->w画成虚线表示后向边,这条边并不是树的一部分

深度优先生成树.PNG

双连通性
一个连通的无向图中任一顶点删除后,剩下的图仍连通(例如邮件系统,公交运输系统)
若图非双连通,将删除后图不再连通的顶点叫做割点
深度优先搜索找割点(连通图)
从图的任一顶点开始,执行深度优先搜索并在顶点被访问是给它们编号,称为前序编号Num(v)
对于深度优先搜索生成树上的每个顶点,计算可回到的编号最低的顶点Low(v)(利用零条或多条边可能还有一条后向边)
Num-Low.PNG

可通过一次后序遍历算出Low
Low(v)=Min{Num(v)(不选取边);
所有后向边(v, w)中最低的Num(w)(选取一条后向边);
所有边(v, w)中最低的Low(w)(选取一些边加一条后向边)}

根是割点当且仅当它有多个儿子
任何其它顶点v是割点,当且仅当它有某个儿子w,Low(w)>=Num(v)
因为此条件意味着要从w到达v上的任何一点必须要经过v

void DFSArticul(ALGraph G, int v0)
{
    min=visited[v0]=count++; //count是DFS访问顺序
    for(p=G.vertices[v0].first;p;p=p->nextarc)
    {
        w=p->adjves;
        if(visited[w]==0)
        {//w是未访问过的
            DFSArticul(G, w);
            if(low[w]<min) min=low[w];
            if(low[w]>=visited[v0])
                //v0是割点
        }else  //w已被访问过则是回边上的点
        if(visited[w]<min)    min=visited[w];
    }
    low[v0]=min
}

count=1; visited[0]=1;
p=G.vertices[0].firstarc;
v=p->adjvex;
DFSArticul(G, v);    //从根的邻接点v开始DFS
if(count<G.vexnum){
    //生成树的根至少有两个子树,根是割点
    while(p->nextarc){
        p=p->nextarc; v=p->adjvex;
        if(!visited[v]) DFSArticul(G, v);
}
     
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 下面介绍中无向图中割点和桥的概念:割点:一个结点称为割点(或者割顶)当且仅当去掉该节点极其相关的边之后的子图不连通...
    Gitfan阅读 2,227评论 0 1
  • 无向图中求割点集和割边集——Tarjan算法割点和割边定义在一个无向图中,如果删除了某个顶点及与之相连的所有边,产...
    Herixth阅读 13,247评论 3 8
  • https://zhidao.baidu.com/question/306594162.html 割点:对于连通图...
    程序猪小羊阅读 12,166评论 1 1
  • 求无向连通图割点(java)-------Tarjan算法 在无向连通图中,如果将其中一个点以及所有连接该点的边去...
    whynotybb阅读 1,096评论 0 0
  • 先把重要的事实贴在这里 搜索树 有向图:树边,返祖边,前向边,横叉边无向图:树边,返祖边(另一种角度看就是前向边,...
    Loboqui阅读 215评论 0 1