【图论专题】无向图的双连通分量
A、AcWing 395. 冗余路径
结论:变成边双连通分量所需要新建的边数
无向图
连多少条边使得整个无向图变成任意两个点之间都有两条完全不相同的路径。
- 结论1:任意两个点之间都有两条完全不相同的路径 =>=>=> 没有割边 =>=>=> 边双连通图
- 结论2: 需要新建的边数:cnt+12\frac{cnt + 1}{2}2cnt+1 (下取整)(其中cnt为将所有的边双连通图缩点以后有割桥形成树的叶子节点,也就是度数为1的结点数)
首先我们可以对图进行边连通分量缩点, 缩点后图就会变成一颗树, 代表任意2点之间的路径是唯一的。 这时候题目转化为添加最少的边使树上任意
2点的路径至少有2条。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N = 5007, M = 50007, INF = 0x3f3f3f3f;int n, m;
int dfn[N], low[N], num;
int head[N], nex[M], ver[M], tot;
int ans;
int stk[N], top;
bool bridge[M];
int d[M];
int dcc_cnt,dcc_id[M];void add(int x, int y){ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}void tarjan(int x, int in_edge){dfn[x] = low[x] = ++ num;stk[++ top] = x;for(int i = head[x];~i; i = nex[i]){int y = ver[i];if(!dfn[y]){tarjan(y,i);low[x] = min(low[x], low[y]);if(dfn[x] < low[y])//x是y的父节点y无法在不经过(x,y)的前提下到达x或者到达比x更早访问的结点,存在割桥bridge[i] = bridge[i ^ 1] = true;}else if(i != (in_edge ^ 1))low[x] = min(low[x], dfn[y]);}if(dfn[x] == low[x]){int y ;++ dcc_cnt;do{y = stk[top -- ];dcc_id[y] = dcc_cnt;}while(x != y);}
}int main(){memset(head,-1,sizeof head);scanf("%d%d",&n, &m);for(int i = 1;i <= m;++i){int x,y;scanf("%d%d",&x, &y);add(x,y), add(y, x);}//因为都连通所以只需要跑一次即可tarjan(1, -1);for(int i = 0;i < tot; i += 2)if(bridge[i]){int x = ver[i], y = ver[i ^ 1];d[dcc_id[x]] ++ ;d[dcc_id[y]] ++ ;}int cnt = 0;for(int i = 1;i <= dcc_cnt;++i)if(d[i] == 1)cnt ++;printf("%d\n", (cnt + 1) / 2);return 0;
}
B、AcWing 1183. 电力(割点应用)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;
const int N = 50007, M = 500007, INF = 0x3f3f3f3f;int n, m;
int dfn[N], low[N], num;
int ver[M], nex[M], edge[M], head[N], tot;
int ans;void add(int x,int y){ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}void tarjan(int x, int rt){//计算该割点连接了多少个连通块dfn[x] = low[x] = ++ num;int cnt = 0;//(割开这个点会将图分成cnt个连通块)for(int i = head[x]; ~i;i = nex[i]){int y = ver[i];if(!dfn[y]){tarjan(y, rt);low[x] = min(low[x], low[y]);if(dfn[x] <= low[y]){//该割点返回了一条独立的路cnt ++ ;}}else low[x] = min(low[x], dfn[y]);}if(x != rt)cnt ++ ;//如果不是根的话说明该点的上面应该可以割出来一个连通块ans = max(ans,cnt);
}int main(){while(~scanf("%d%d",&n,&m) && n || m){memset(head, -1, sizeof head);memset(dfn, 0, sizeof dfn);tot = num = 0;for(int i = 1;i <= m;++i){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}ans = 0;int cnt = 0;for(int i = 0;i < n;++ i){//数据从0到n - 1if(!dfn[i]){cnt ++ ;//可能有孤立点(孤立连通块)tarjan(i, i);}}printf("%d\n", ans + cnt - 1);//减去多算的这个点(ans是由这个点割开之后能分散开的连通块个数)}
}
C、AcWing 396. 矿场搭建
【图论专题】无向图的双连通分量相关推荐
- POJ 3352 无向图边双连通分量,缩点,无重边
为什么写这道题还是因为昨天多校的第二题,是道图论,HDU 4612.当时拿到题目的时候就知道是道模版题,但是苦于图论太弱.模版都太水,居然找不到.虽然比赛的时候最后水过了,但是那个模版看的还是一知半解 ...
- 有向图的强连通分量与无向图的双连通分量总结
首先我们需要搞懂图论中的一些基础概念 完全图: 假设一个图有 n n n 个顶点, 并且每两个点之间都有边就叫完全图 连通图(多指无向图): 对于两个点, u , v , u,v, u,v, 如果 u ...
- 无向图的双连通分量(一)
目录 无向图的双连通分量 概念 ①边双连通分量 e-DCC 桥: ②点双连通分量 v-DCC 割点: e-DCC Tarjan算法 判断当前边是否为桥: 寻找e-DCC: 例题 代码 tarjan算法 ...
- hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)
1 /* 2 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! 3 4 tm太坑了... 5 1,如果这个无向图开始就是一个非连通图,直接输出0 6 2,重边(两个节点存在多条边, 权 ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
- 图论学习-无向图双连通分量
文章目录 无向图双连通分量 1.基本术语与概念 1.1.割点 1.2.桥 1.3.边双连通分量 (e-DCC) 1.4 点双连通分量 (v-DCC) 1.5 时间戳 2.求解 2.1 边双连通分量 2 ...
- 无向图双连通分量BCC(全网最好理解)
不是标题党,之前我也写过一篇比较全的,但是对于初学者不友好.传送门? 双连通分量(Biconnected component): 1.边双联通 E-BCC 2.点双连通 V-BCC 双 ...
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
基本概念 给定无向连通图G = (V, E) 割点: 对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点 割边(桥) 若对于e∈E,从图中删去边e之 ...
- 无向图——双连通分量
双连通图:在无向图连通图中,如果删除该图中的任意一点和依附它的边,不改变图的连通性,则称该图为双连通的无向图. 由上述定义可知,双连通分量中,每两个结点之间至少有两条不同的路径可以相互到达. 割点:在 ...
最新文章
- php laravel框架项目实例
- c语言中vector函数大全,vector :: empty()函数,以及C ++ STL中的示例
- oracle安装时EM,EM 安装时报错 - Oracle数据库管理 - ITPUB论坛-中国专业的IT技术社区...
- python打开界面-python学习笔记(图形用户界面)
- pytorch调用tensorboard方法尝试
- linux set 39 date 39,Linux date命令
- 使用BeautifulSoup爬取“0daydown”站点的信息(2)——字符编码问题解决
- 很值得看看的中文翻译The Django Book
- dell服务器运维,【产品鉴赏】戴尔DELL R710服务器
- 拿下多家主机厂数百万前装定点,禾赛科技激光雷达量产进程加速
- 实战|教你爬取全国火锅店数量,并利用地图可视化展示
- 史上最全图解JVM,京东小哥带你了解性能提升100%背后的秘密武器
- EBCDIC、ASCII与EBCDIC的关系及相互转化
- 2018江西省计算机知识竞赛,2018年信息技术知识竞赛题库及答案
- Spearman 相关性分析法,以及python的完整代码应用
- 局域网协议分类(计算机网络)
- 大学生交友平台——项目启动篇
- Revit模型导出fbx带标准材质
- Vue.js学习-搭建一个简单的demo
- js判断是否在微信浏览器中打开网页