Tarjan割点

Tarjan割点定义 在无向连通图中 如果将其中一个点以及所有连接该点的边去掉 图就不再连通 那么这个点就叫做割点 在无向连通图中 如果将其中一条边去掉 图就不再连通 那么这条边叫桥 思想 割点 1 当前节点 u 为树根的时候 这个节点要有至少两棵子树 否则去掉该节点不会有影响 2 当前节点 u 不是树根的时候 要满足 low v gt dfn u 注意 u 是 v 的父亲

[定义]:

无向连通图中,如果将其中一个点以及所有连接该点的边去掉,图就不再连通,那么这个点就叫做割点。

无向连通图中,如果将其中一条边去掉,图就不再连通,那么这条边叫桥。

[思想]:

割点:1)当前节点u为树根的时候,这个节点要有至少两棵子树,否则去掉该节点不会有影响。

           2)当前节点u不是树根的时候,要满足low[v]>=dfn[u],注意u是v的父亲 。

                 这个父亲是自己根据tarjan搜索的先后顺序,让v的父亲是u。

         【注意】:我这里说的是树根,不是环的根,一个树只有一个树根

         【注解】:1)v是一个点那么low[v]=dfn[v],u后面有个点那么u是个割点

                           2)v所在有一个环那么low[v]=dfn[x] (x是这个环的根),

                                 dfn[x]>dfn[u],u后面连接个环,那么u是个割点。(图1)

                                 dfn[x]=dfn[u],u是一个环的根,没有u,u后面的子节点无法联通

                           4)dfn[x]

                                 也有可能low[low[u]]=dfn[x],就是u这个环的根(low[u]=dfn[根])

                                 在一个dfn[x]更小的环中,这相当于两个只是相连的环合并成一个大环了(图2)

桥:当且仅当无向边(u,v)是树枝边的时候,需要满足dfn(u)

       那么u–v之间一定能够有1条或者多条边不能删去,因为他们之间有一部分无环,是桥。

      【注意】:是”<"不是“<=”,u是在这个环的根,因为无向图,少了u->v,图依然联通。(图1)

   Tarjan割点Tarjan割点Tarjan割点


[代码]

#include 
   
     #include 
    
      #include 
     
       using namespace std; struct ss{ int v; int next; }s[105*105]; int head[100]; int dfn[100]; int low[100]; int res[100];//统计割点 int a[100],b[100]; int n,m,cnt,num,sum; void init() { memset(head,-1,sizeof(head)); memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); memset(res,0,sizeof(res)); cnt=num=sum=0; } void add(int u,int v) { s[cnt].v=v; s[cnt].next=head[u]; head[u]=cnt++; } void Tarjan(int u,int father) { int son=0;//树根的子树 dfn[u]=low[u]=++num; for(int i=head[u];i!=-1;i=s[i].next) { int v=s[i].v; if(!dfn[v]) { son++; Tarjan(v,u);//v的父亲是u low[u]=min(low[u],low[v]); if(u!=father && low[v]>=dfn[u])//u不是树根 res[u]=1; if(low[v]>dfn[u]) { a[sum]=u; b[sum]=v; sum++; } } else if(v!=father) low[u] = min(low[u],dfn[v]); /* 定义了父亲就是定了一个搜索的方向 v!=father是防止往回走,以免两点成环 这个地方与缩点不一样了 可以说无向图就是一个大环 不能用栈将整个环都缩到一点 我们要相连的环的根有不同的dfn[根] 而每个环有相同的dfn[根]用low记录 这样每个环的根都是一个割点 关于如图3 因为是无向图,所以不用将同时出栈的缩成一个点 2->4后直接就4->5->6,保证同一个外环同一个low */ } if(u==father && son>1)//u是树根 res[u]=1; return; } int main() { while(~scanf("%d%d",&n,&m) && n+m) { init(); int u,v; for(int i=1;i<=m;i++) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } for (int i = 1; i <= n; i++) if (!dfn[i]) Tarjan(i, i); for (int i = 1; i <= n; i++) if(res[i])printf("割点:%d\n",i); printf("桥:%d\n",sum); for (int i = 0; i < sum; i++) printf("%d<->%d\n",a[i],b[i]); } return 0; } 
      
     
   

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228965.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午5:47
下一篇 2026年3月16日 下午5:47


相关推荐

  • Swagger UI引入

    Swagger UI引入Swagger 是一个 Restful 风格接口的文档在线自动生成和测试的框架 http swagger io SwaggerUI 可以自动生成接口文档 不需要频繁更新接口文档 保证接口文档与代码的一致 代码改动时 接口文档可以自动修改 1 添加依赖 dependency groupId io springfox groupId artifactId springfox swagger2 artifactId dependency

    2026年3月17日
    2
  • silverlight开发教程_手机安装silverlight插件

    silverlight开发教程_手机安装silverlight插件教程地址:http://kb.cnblogs.com/zt/silverlight/

    2026年4月13日
    5
  • 免费申请国外免费域名超详细教程[通俗易懂]

    免费申请国外免费域名超详细教程[通俗易懂]1.首先申请免费域名网站:https://my.freenom.com/domains.php2.填入域名,这里我们以xcflag为列(尽量选择复杂一点的或者五个字母以上的域名,因为简单的有些域名是需要收费的),点击检查可用性。3.可以看到很多免费的域名(用的谷歌翻译插件,翻译有时候不是很准确,free翻译过来应该是免费而不是自由,之后会写一些关于谷歌插件的笔记,详细讲解)4.我们选择xcflag.tk点击立即获取,稍等一会点击购物车查看绿色按钮5.默认三个月试用,这里下拉框我们选择十二个月

    2022年6月30日
    84
  • 阿里巴巴加码争夺AI Agent市场 天地在线涨停

    阿里巴巴加码争夺AI Agent市场 天地在线涨停

    2026年3月16日
    2
  • Prometheus➕Grafana监控MySQL性能

    Prometheus➕Grafana监控MySQL性能

    2021年6月2日
    126
  • NFS挂载的2种方式

    NFS挂载的2种方式在第一期视频 第 0 课第 7 节 刚接触开发板之制作根文件系统及初试驱动 wmv 因为要测试驱动 所以必须要把驱动程序弄到开发板里才行 于是韦老师介绍了两种方式 1 仅用 flash 上的根文件系统启动后 手工 MOUNTNFS 使用 NFS 作为根文件系统来启动视频中只介绍了开发板这端 uboot 参数的设置 并未介绍 Ubuntu 端 NFS 服务器的设置 这就导致很多学员学习时遇到难以逾越的问题 NFS 挂载

    2026年3月18日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号