题意:求解在删除两个点之后的最大连通分量
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(割点+最大连通分量)相关推荐

  1. hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

    题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有 ...

  2. 无向图双连通分量(DCC)

    目录 1.边连通分量 1.冗余路径 2.点连通分量 1.电力 2.矿场搭建 1.边连通分量 边连通分量(e-DCC): 就是删除无向图的一条边,假如该图不连通了,则这条边叫做桥,边连通分量就是极大的不 ...

  3. Tarjan算法(求强连通分量与割点)

    Tarjan算法,是以一位计算机界大佬的名字命名的算法,多用于解决LCA,割点,强连通分量等问题,下面是其发明者的简短介绍. Robert Tarjan,计算机科学家,以LCA.强连通分量等算法闻名. ...

  4. ACM小白入门之必须要了解的东西

    ACM 国际大学生程序设计竞赛历史与介绍 程序设计竞赛是指考察程序设计能力的竞赛,分为解题竞赛.创意竞赛.性能竞赛等.程序设计竞赛的主要代表是 ACM-ICPC(ACM 国际大学生程序设计竞赛),AC ...

  5. ACM入门及STL简介(转)

    第一章 新手入门 1.      ACM国际大学生程序设计竞赛简介 1)      背景与历史 1970年在美国TexasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕. ...

  6. ACM入门及STL简介

    1.       ACM 国际大学生程序设计竞赛简介 1)       背景与历史 1970 年在美国TexasA&M 大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕.1977 ...

  7. ACM 国际大学生程序设计竞赛历史与介绍

    程序设计竞赛是指考察程序设计能力的竞赛,分为解题竞赛.创意竞赛.性能竞赛等.程序设计竞赛的主要代表是 ACM-ICPC(ACM 国际大学生程序设计竞赛),ACM 程序设计大赛是大学级别最高的脑力竞赛, ...

  8. Tarjan学习小记

    子图:由这张图的一部分构成的图 点:节点 边:连接节点的东西,分为有向和无向 重边:两点之间存在两条及以上的边 自环:自己连自己的边 环:一些边使得这些点可以不重复经过这些边到达上面的任意一个节点 简 ...

  9. 边双连通和点双连通(连通性)

    一.时间戳: 1.一种记录时间的方式,像DFS序 2.防伪,不重复,精确到时刻 3.对每个节点而言,时间戳一般用dfn[i]来表示,最小时间戳一般用low[i]来表示 二.一些边: 1.前向边:当前点 ...

最新文章

  1. Tomcat V6 Examples移植到Apusic V5.1
  2. 热潮下的冷思考,人工智能即将改变的三大领域
  3. redis设置数据库数量databases
  4. 按汉字首字母排序(sql语句)
  5. JVM之堆Heap体系概述
  6. 漫画:千万别在同事面前装逼
  7. cad插件加载bplot成功用不了_新手入门,学习CAD必须掌握,教你使用标注命令,绘图效率翻一倍...
  8. java中set怎么建int型_使用Array.setInt来填充Java中的数组
  9. H264--4--H264编码[7]
  10. 编程范式之栈的抽象操作
  11. matlab定义和调用函数m,Matlab学习-自定义函数与调用
  12. 历时三月,致远互联从“鸟巢”飞到哪了?
  13. Fpdi实现pdf页面合并(php)
  14. 修改虚拟机名称和主机名称
  15. 做数据分析很重要的思维模式!!!
  16. 【GetFeature】返回来自数据源的特征选择,包括几何和属性值
  17. linux下编译doppia,Grub错误总结解决方案(共十七条)
  18. echarts 地图外边框投影 阴影立体效果
  19. Android开发面试经典题目
  20. 各位端午节快乐 -- Happy the Dragon-Boat Festival

热门文章

  1. Flask开发服务器启动方式
  2. Pytorch中的向前计算(autograd)、梯度计算以及实现线性回归操作
  3. python函数的用法详解(作用、定义、调用、函数参数、函数返回值、函数说明文档、函数嵌套使用)
  4. 计算器,利用灰度图的顶帽扣出数字
  5. Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)
  6. 驱动 2.4'' TFT 串口触摸屏
  7. 知乎上看到一个关注软件测试的问答,太直接了
  8. Microsoft Remote Desktop移动客户端QA
  9. Adhesive框架系列文章--Mongodb数据服务模块使用(上)
  10. 用命令行查看局域网的其他在线的ip