无向图的双连通分量 DCC

news/2024/5/7 17:35:55/文章来源:https://blog.csdn.net/lee_14141/article/details/127346105

双连通分量又称为重连通分量

分为

(1)边的双连通分量 EDCC :极大的不含桥的连通区域(块)

性质:

        边的双连通分量不管删掉哪条边都是连通的

        任意两点之间都包含两条不相交的路径(充分必要)

(2)点的双连通分量 VDCC :极大的不包含割点的连通分量(块)

性质:        

        每个割点都会至少属于两个连通分量

概念:桥定义为在无向图中,如果删掉一条边 整个图会变得不连通 则这个边称为桥

割点:在无向图中,如果把某个点和与这条边关联的边都删掉 整个图会变得不连通的话,则这个点就称为割点

两个割点之间的边不一定是桥 一个桥两边的点不一定是割点

点连通分量不一定是边连通分量 一个边连通分量不一定是点连通分量

边双连通分量解法

时间戳 dfn(x) low(x) (无向图不存在横叉边)

(1)如何找到桥 (x <----> y )

        桥等价于dfn(x) < low(y)

(2)如何找到所有的边双连通分量

        方法一:将所有的桥删掉

        方法二:用一个栈 dfn(x)==low(x)

1.冗余路径

395. 冗余路径 - AcWing题库

给定一个无向连通图,问最少加多少条边,使得该图变成一个边双连通分量

#include <bits/stdc++.h>
using namespace std;
const int N=5010,M=20010;
int n,m;
int h[N],e[M],ne[M],idx;
int dfn[N],low[N],timestamp;
int stk[N],top;
int id[N],dcc_cnt;
bool is_brige[M];
int d[N];
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int u,int from)
{dfn[u]=low[u]=++timestamp;stk[++top]=u;for(int i=h[u];~i;i=ne[i]){int j=e[i];if(!dfn[j]){tarjan(j,i);low[u]=min(low[u],low[j]);if(dfn[u]<low[j]){is_brige[i]=is_brige[i^1]=true;}}else if(i!=(from^1))low[u]=min(low[u],dfn[j]);}if(dfn[u]==low[u]){++dcc_cnt;int y;do{y=stk[top--];id[y]=dcc_cnt;}while(y!=u);}
}
int main()
{cin>>n>>m;memset(h,-1,sizeof h);while(m--){int a,b;cin>>a>>b;add(a,b),add(b,a);}tarjan(1,-1);for(int i=0;i<idx;i++){if(is_brige[i])d[id[e[i]]]++;}int res=0;for(int i=1;i<=dcc_cnt;i++)if(d[i]==1)res++;printf("%d\n",(res+1)/2);return 0;
}

点连通分量解法

dfn(x) low(x)

(1)如何求割点(x <----> y) 

low[y]>=dfn[x]

情况一:如果x不是根节点 那么x就是一个割点

情况二:如果x是根节点 至少有两个子节点满足yi low[yi]>=dfn[x]

 2.电力

信息学奥赛一本通(C++版)在线评测系统

1.统计连通块个数 cnt

2.依次枚举从哪个块中删

3.再枚举删除哪个点

4.删完以后看看那个连通块剩多少部分 设为s部分

那么答案就是s+cnt-1

怎么删点呢 如果dfn[x]<=low[y] 那么如果把x删掉 y就会单独出来(割点定义)

那么就是去删除割点 割点还要特判根节点

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10010,M=30010;
int n,m,ans,root;
int h[N],e[M],ne[M],idx;
int dfn[N],low[N],timestamp;
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int u)
{dfn[u]=low[u]=++timestamp;//第一次遍历让她们都等于时间戳int cnt=0;//记录删除割点后的连通块个数for(int i=h[u];~i;i=ne[i]){int j=e[i];if(!dfn[j])//假如没有遍历过{tarjan(j);//遍历一遍low[u]=min(low[u],low[j]);if(low[j]>=dfn[u]) cnt++;//假如是割点,则连通块++}else  low[u]=min(low[u],dfn[j]);//更新一遍最小值}if(u!=root&&cnt) cnt++;//假如不是根,且连通块个数不为0,说明这个也是一个割点,则连通块个数+1ans=max(ans,cnt);//更新一遍最大值
}
int main()
{while(scanf("%d%d",&n,&m),n||m){memset(dfn,0,sizeof dfn);//清空,因为dfn兼具判重的作用memset(h,-1,sizeof h);//清空idx=timestamp=0;//清空状态while(m--){int a,b;scanf("%d%d",&a,&b);add(a,b),add(b,a);}ans=0;int cnt=0;for(root=0;root<n;root++)//枚举每个为根if(!dfn[root])//假如不在任何一个连通块中{cnt++;//则新开个连通块tarjan(root);//遍历一遍}printf("%d\n",cnt+ans-1);}return 0;
}

(2)如何求点双连通分量

 

3.矿场搭建

给定一个无向图,问最少在几个点上设置出口,可以使得不管哪个点坍塌,其余所有点都可以与某个出口连通 

 这里的cnt-1是因为已经放了一个门在叶子节点了 所以是在cnt-1个点里面选一个门去放 所以是cnt-1而不是不包含割点

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=1010,M=510;
int n,m,root;
int h[N],e[M],ne[M],idx;
int dfn[N],low[N],timestamp;
int stk[N],top;
int id[N],dcc_cnt;
vector<int>dcc[N];
bool cut[N];
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int u)
{dfn[u]=low[u]=++timestamp;//第一次遍历让她们都等于时间戳stk[++top]=u;if(u==root&&h[u]==-1)//假如是孤立点{dcc_cnt++;dcc[dcc_cnt].push_back(u);return;}int cnt=0;//记录子树的个数for(int i=h[u];~i;i=ne[i]){int j=e[i];if(!dfn[j])//假如没有遍历过{tarjan(j);//遍历一遍low[u]=min(low[u],low[j]);if(low[j]>=dfn[u]){cnt++;//子树加1if(u!=root||cnt>1) cut[u]=true;//假如不为根或者子树为>1则为割点++dcc_cnt;int y;//求割点中的点,也即点连通块的点,并放进队列中去do{y=stk[top--];dcc[dcc_cnt].push_back(y);}while(y!=j);dcc[dcc_cnt].push_back(u);}}else  low[u]=min(low[u],dfn[j]);//更新一遍最小值}
}
int main()
{int T=1;while(cin>>m,m){for(int i=1;i<=dcc_cnt;i++) dcc[i].clear();//清空idx=n=timestamp=top=dcc_cnt=0;//初始化memset(cut,0,sizeof cut);//清空割点memset(dfn,0,sizeof dfn);//清空,因为dfn兼具判重的作用memset(h,-1,sizeof h);//清空while(m--){int a,b;scanf("%d%d",&a,&b);n=max(n,max(a,b));add(a,b),add(b,a);}for(root=1;root<=n;root++)//枚举每个为根if(!dfn[root])//假如不在任何一个连通块中tarjan(root);//遍历一遍int res=0;ull num=1;for(int i=1;i<=dcc_cnt;i++)//枚举每一个连通块{int cnt=0;int len=dcc[i].size();for(int j=0;j<len;j++)//枚举该连通块的点if(cut[dcc[i][j]])//假如是割点,则割点++cnt++;if(cnt==0&&len>1) res+=2,num*=len*(len-1)/2;//假如不是割点且点的数量大于1else if(cnt==0) res++;//假如不是割点点的数量为1,则为孤立点else if(cnt==1) res++,num*=len-1;//假如有一个割点}printf("Case %d: %d %llu\n",T++,res,num);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_401980.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电压掉电监测电路-三极管电路分析

电压掉电监测电路 电路在电压掉电时处于不稳定状态&#xff0c;经常需要采取一些应对措施。比如音响&#xff0c;内部的音频功率放大电路&#xff0c;在被突然拔掉电源时会发出刺耳的爆破音。 如果加入电压掉电监测电路&#xff0c;当监测到电压掉电时&#xff0c;输出一个信号…

MySQL目录结构与SQL基本概念

MySQL目录结构 1.MySQL安装目录配置文件 my.ini1、bin目录 用于放置一些可执行文件,如mysql.exe、mysqld.exe、mysqlshow.exe等。 2、data目录 用于放置一些日志文件以及数据库。 3、include目录 用于放置一些头文件,如:mysql.h、mysql_ername.h等。 4、lib目录 用于放置一系…

刷爆leetcode第七期 0018

刷爆leetcode第七期 0018题目编号0018 用队列实现栈第一步 定义结构体第二步 实现创建&#xff08;初始化&#xff09;第三步 删除接口函数第四步 返回头的值总结发现问题一发现问题二源码题目编号0018 用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&…

.NET周报【10月第1期 2022-10-11】

本周精选 继C#实现await/async无栈协程几年后,davidwrighton实现了.NET绿色线程(有栈协程)的原型 https://github.com/dotnet/runtimelab/pull/2002 .NET Runtimelab中绿色线程的原型实现的PR,在不久的将来,.NET开发者也可以方便的用上有栈协程,目前的启动一个有栈协程的AP…

docker:基础命令未完待续

基础操作 docker info #查看docker的基本信息docker version #查看docker版本信息一、镜像操作 1、搜索镜像 docker search nginx2、下载镜像 docker pull nginx#从仓库中下载镜像&#xff0c;若没有指定标签&#xff0c;则下载最新的版本&#xff0c;也就是标签为: la…

Python快速刷题网站——牛客网 数据分析篇(十五)

&#x1f466;&#x1f466;一个帅气的boy&#xff0c;你可以叫我Love And Program &#x1f5b1; ⌨个人主页&#xff1a;Love And Program的个人主页 &#x1f496;&#x1f496;如果对你有帮助的话希望三连&#x1f4a8;&#x1f4a8;支持一下博主 前言 本文将继续学习pan…

MySQL的行锁、间隙锁和临建锁

目录 行锁 间隙锁&临键锁 行锁 InnoDB实现了以下两种类型的行锁&#xff1a; 共享锁&#xff08;S&#xff09;&#xff1a;允许一个事务去读一行&#xff0c;阻止其他事务获得相同数据集的排它锁。 //共享锁和共享锁兼容&#xff0c;共享锁和排他锁互斥。 排他锁&#…

43 多个相同限定名类型同时存在导致的继承结构混乱的情况

前言 // 四刷天府绿道 呵呵 在前面文章中 jetty-runner:jar:9.3.20 和 tomcat-embed-core-8.5.29 的 JarScannerCallback 不兼容, 导致服务启动失败 提到了这样的一个问题 我们再看一下这里的 callback 的接口, jetty-runner 的这个对象里面是没有 void scan(Jar jar, Str…

【附源码】计算机毕业设计SSM民宿短租系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

JavaEE - Servlet(向服务器上传文件 Part类)

我们在需要向服务器上传文件时&#xff0c;在前端需要使用form表单&#xff0c;form表单需要使用特殊的类型 form-data 此时提交文件的时候&#xff0c;浏览器会把文件内容以form-data的格式构造到HTTP请求中&#xff0c;服务器就可以通过getPart获取了 需要注意&#xff1a;…

2.idea 标定相关

1.发现 VINS对于参数准确性的要求高于ORBSLAM。依据是相同的参数,ORBSLAM可以提供准确的定位结果,但是VINS很容易就会发散。在线标定外参很有效,经历过几次外参标定以后的外参给VINS可以获得很好的效果,但是不排除只是针对这个场景,随后测试如果效果好,考虑给ORBSLAM3增加…

Redis常见的问题

① 缓存雪崩 缓存雪崩是指在短时间内&#xff0c;有⼤量缓存同时过期&#xff0c;导致⼤量的请求直接查询数据库&#xff0c;从⽽对数据库造成 了巨⼤的压⼒&#xff0c;严重情况下可能会导致数据库宕机的情况叫做缓存雪崩。 我们先来看下正常情况下和缓存雪崩时程序的执⾏流…

docker安装tomcat、mysql、redis

一、tomcat 1.下载tomcat8docker pull tomcat:8.5.612.启动容器(-d 后台启动)docker run -d -p 8080:8080 tomcat:8.5.61 3.访问首页http://ip:8080/访问不到 404 解决:需要修改tomcat下的文件夹 如下 进入后webapps.dist改为webapps 二、mysql 1.拉取mysqldocker pull mys…

网课题搜答案公众号接口系统

网课题搜答案公众号接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xf…

分布式数据库的基本概念

1.分布式数据库系统的产生和定义 产生原因: 经济的发展&#xff1a;经济发展&#xff1a;跨国公司&#xff1a;产生一个地方需要管理另外一个地方数据的需求 发展历程&#xff1a; 20世纪70年代末 成长于80年代 第一个数据库系统SDD-1是美国计算机公司(CAA)于1976年-1978年…

浏览器插件官方demo学习(一):基本代码、页面渲染、书签、cookie、Omnibox等

前言 参考&#xff1a;https://github.com/GoogleChrome/chrome-extensions-samples 官方目前只提供了几个基于v3版本的例子&#xff0c;其他例子都是基于v2版本的&#xff08;可能是官方比较忙&#xff0c;没空写例子吧&#xff09;。先从v3版本的例子开始学习&#xff0c;后…

JVM(六) —— 运行时数据区之堆的详细介绍(一)

JVM&#xff08;六&#xff09; —— 运行时数据区之虚拟机栈的详细介绍核心概述堆空间代码演示堆空间划分&#xff08;重要&#xff09;一个Java程序运行起来是一个进程&#xff0c;这个进程对应着一个JVM实例&#xff0c;一个JVM实例对应着一个运行时数据区。而一个运行时数据…

JAVA设计模式-组合模式

目录 1、例子 2、组合模式基本定义 总结&#xff1a; 1、例子 编写程序展示一个学校院系结构&#xff1a;需求是这样&#xff0c;要在一个页面中展示出学校的院系 组成&#xff0c;一个学校有多个学院&#xff0c;一个学院有多个系传统解决方案&#xff1a; 分析&#xff1a;…

一起学solidity写智能合约——整型(uint和int)

前言 整型一般用的比较多&#xff0c;会在各个合约中见到整型的存在&#xff0c;那么这个类型也是学习路上不可或缺的 环境&#xff1a; remix编译器点我跳转 正文 我们在sol中遇得到很多类型为整型的数据&#xff0c;所以我们的sol提供了两种数据类型的整型&#xff1a; …

基于物联网的户外环境检测装置设计

目 录 摘 要 1 Abstract 2 第1章 绪论 4 1.2 选题背景及意义 4 1.2 研究现状 4 1.3本课题的发展趋势和研究可行性 5 1.4研究主要内容 5 第2章 基于物联网的户外环境检测装置设计概述和相关原理 6 2.1 系统的概述 6 2.1.1 总体设计方案 6 2.1.2 总体框图 6 2.2 相关理论 7 2.2.1…