欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 双连通性(算法篇)

双连通性(算法篇)

2025/1/18 18:17:02 来源:https://blog.csdn.net/hellmorning/article/details/140356692  浏览:    关键词:双连通性(算法篇)

算法之双连通性

双连通性

概念

  • 双连通性就是当删除图中的一个顶点,使图分割成两个图,则这个图就具有双连通性,而能导致图分割成多张图的顶点称为割点
  • 背向边:当一个顶点被访问时,选取该顶点其中一个未访问过的邻接顶点进行访问没被选取到的邻接顶点与当前顶点形成的边称为背向边

寻找割点

  • 从图中任一顶点开始执行深度优先搜索并在顶点被访问时给它们编号。对于每一个顶点v我们称其先序编号为Num(v);

  • 对于深度优先搜索生成树上的每一个顶点v,计算编号最低的顶点,我们称之为Low(v);对于求解每个顶点的Low,需要对深度优先生成树进行一次后序遍历算出,因为求出顶点v的Low的规则如下:

    1. Num(v)
    2. 所有背向边(v,w)中的最低Num(w)
    3. 树的所有边(v,w)中的最低Low(w) --所以需要后序遍历
    4. Low(v)等于前面三个变量中的最小值。
  • 如果一个顶点v为割点,需要满足它的子节点wLow(w)>=Num(v)

实现代码:

struct listnode{int data;     //numbool flag;    //判断是否访问过int parent;     //父节点int low;listnode* next;
};int count=1;void findart(int v){an[v].flag= true;an[v].low=an[v].data=count++;listnode* p=an[v].next;while (p!= nullptr){if(!an[p->data].flag){an[p->data].parent=v;findart(p->data);if(an[p->data].low>=an[v].data){cout<<"V"<<v<<"为割点"<<endl;}an[v].low=min(an[v].low,an[p->data].low);}else if(an[v].parent!=p->data){an[v].low=min(an[v].low,an[p->data].data);}p=p->next;}}

尾言

完整版笔记也就是数据结构与算法专栏完整版可到我的博客进行查看,或者在github库中自取(包含源代码)

  • 博客1: codebooks.xyz
  • 博客2:moonfordream.github.io
  • github项目地址:Data-Structure-and-Algorithms

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com