HDU4587(割点+最大连通分量)
题意:求解在删除两个点之后的最大连通分量
tarjan判断割点的方法:如果被判断为割点说明强连通分量要增加一。
这个内容我也刚学习,这都是看着大神的代码敲出来的!
注意求解割点的内容:以下内容是在自己学习中总结出来的:
1.割点:在无向图中,若删去该点后图不连通,则此点为割点。
2.low[u]定义:表示在DFS回溯的前提下,该节点vi不通过父节点到vi这条边所能连通的顶点时间戳最小值。初始时,low[i]=dfn[i]
当dfs处理到末尾的向前回溯,同时维护:low[fa]=min{low[fa],low[child]}
3.dfn[i]:表示在DFS回溯的前提下,该节点vi被遍历的时间先后顺序,顺序递增。
4.顶点u的割点的条件:
(1).特判树根:u为树根,且u有多于一个子树
(2).u不为树根:在递归树上u有子节点v,满足:dfn[u] <=low[v]
5.
边(u,v)是割边:当且仅当(u,v)为树边,且满足dfn[u]<low[v](等价于low[v]==dfn[v])
(1).既从v出发无法到达u以及此u更早的节点
(2).非树边不可能是割边,重边不可能是割边
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<cstdio>
using namespace std;
const int maxx=5005;
const int inf=0x3f3f3f3f;
vector<int>G[maxx];//邻接表存储
int low[maxx];
int dfn[maxx];
int flag[maxx];
int n,m;
int index;
int root;
void dfs(int u,int fa){index++;int child=0;dfn[u]=low[u]=index;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v==fa)continue;if(dfn[v]==0){child++;dfs(v,fa);low[u]=min(low[u],low[v]);if(v!=root&&low[v]>=dfn[u]){flag[u]++;}if(v==root&&child==2){//当为根节点时,且有左右子树,说明该节点为割点flag[u]++;}}else {low[u]=min(low[u],dfn[v]);}}
}
void dfs_2(int n){int ans=0;for(int i=1;i<=n;i++){memset(dfn,0,sizeof(dfn));for(int j=1;j<=n;j++){flag[j]=1;}int sum=0;index=1;for(int j=1;j<=n;j++){if(i!=j&&!dfn[j]){sum++;flag[j]=0;dfs(j,i);}}for(int j=1;j<=n;j++){if(i!=j){ans=max(ans,sum+flag[j]-1);}}}cout<<ans<<endl;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){memset(dfn,0,sizeof(dfn));memset(flag,0,sizeof(flag));memset(low,0,sizeof(low));for(int i=1;i<=maxx;i++){G[i].clear();}root=1;for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);a++;b++; G[a].push_back(b);G[b].push_back(a);}dfs_2(n);}return 0;
}
HDU4587(割点+最大连通分量)相关推荐
- hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。
题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有 ...
- 无向图双连通分量(DCC)
目录 1.边连通分量 1.冗余路径 2.点连通分量 1.电力 2.矿场搭建 1.边连通分量 边连通分量(e-DCC): 就是删除无向图的一条边,假如该图不连通了,则这条边叫做桥,边连通分量就是极大的不 ...
- Tarjan算法(求强连通分量与割点)
Tarjan算法,是以一位计算机界大佬的名字命名的算法,多用于解决LCA,割点,强连通分量等问题,下面是其发明者的简短介绍. Robert Tarjan,计算机科学家,以LCA.强连通分量等算法闻名. ...
- ACM小白入门之必须要了解的东西
ACM 国际大学生程序设计竞赛历史与介绍 程序设计竞赛是指考察程序设计能力的竞赛,分为解题竞赛.创意竞赛.性能竞赛等.程序设计竞赛的主要代表是 ACM-ICPC(ACM 国际大学生程序设计竞赛),AC ...
- ACM入门及STL简介(转)
第一章 新手入门 1. ACM国际大学生程序设计竞赛简介 1) 背景与历史 1970年在美国TexasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕. ...
- ACM入门及STL简介
1. ACM 国际大学生程序设计竞赛简介 1) 背景与历史 1970 年在美国TexasA&M 大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕.1977 ...
- ACM 国际大学生程序设计竞赛历史与介绍
程序设计竞赛是指考察程序设计能力的竞赛,分为解题竞赛.创意竞赛.性能竞赛等.程序设计竞赛的主要代表是 ACM-ICPC(ACM 国际大学生程序设计竞赛),ACM 程序设计大赛是大学级别最高的脑力竞赛, ...
- Tarjan学习小记
子图:由这张图的一部分构成的图 点:节点 边:连接节点的东西,分为有向和无向 重边:两点之间存在两条及以上的边 自环:自己连自己的边 环:一些边使得这些点可以不重复经过这些边到达上面的任意一个节点 简 ...
- 边双连通和点双连通(连通性)
一.时间戳: 1.一种记录时间的方式,像DFS序 2.防伪,不重复,精确到时刻 3.对每个节点而言,时间戳一般用dfn[i]来表示,最小时间戳一般用low[i]来表示 二.一些边: 1.前向边:当前点 ...
最新文章
- Tomcat V6 Examples移植到Apusic V5.1
- 热潮下的冷思考,人工智能即将改变的三大领域
- redis设置数据库数量databases
- 按汉字首字母排序(sql语句)
- JVM之堆Heap体系概述
- 漫画:千万别在同事面前装逼
- cad插件加载bplot成功用不了_新手入门,学习CAD必须掌握,教你使用标注命令,绘图效率翻一倍...
- java中set怎么建int型_使用Array.setInt来填充Java中的数组
- H264--4--H264编码[7]
- 编程范式之栈的抽象操作
- matlab定义和调用函数m,Matlab学习-自定义函数与调用
- 历时三月,致远互联从“鸟巢”飞到哪了?
- Fpdi实现pdf页面合并(php)
- 修改虚拟机名称和主机名称
- 做数据分析很重要的思维模式!!!
- 【GetFeature】返回来自数据源的特征选择,包括几何和属性值
- linux下编译doppia,Grub错误总结解决方案(共十七条)
- echarts 地图外边框投影 阴影立体效果
- Android开发面试经典题目
- 各位端午节快乐 -- Happy the Dragon-Boat Festival
热门文章
- Flask开发服务器启动方式
- Pytorch中的向前计算(autograd)、梯度计算以及实现线性回归操作
- python函数的用法详解(作用、定义、调用、函数参数、函数返回值、函数说明文档、函数嵌套使用)
- 计算器,利用灰度图的顶帽扣出数字
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)
- 驱动 2.4'' TFT 串口触摸屏
- 知乎上看到一个关注软件测试的问答,太直接了
- Microsoft Remote Desktop移动客户端QA
- Adhesive框架系列文章--Mongodb数据服务模块使用(上)
- 用命令行查看局域网的其他在线的ip