1.割点和割边:
割点:在无向图中,删除某个节点后,图的连通分量数量增加,则称该节点为割点
桥:如果删除某条边后,连通图变得不再连通,则此条边为桥,或者为割边
下面说一种用DFS求割点的算法,即利用了“深度优先搜索生成树”求割点。
如何判断一个点是否为割点呢?
(1)如果这个点为搜索出发的点(根节点)如果他有两个及两个以上的路出发,那么这个根节点即是割点。
(2)如果他不是根节点,那么我们就要判断通过他继续往下搜索是否有路可以返回他的祖先(不能通过他的父节点)
这里主要用了两个数组来实现以上操作,即low[]和num[],low记录了此数组能返回的最早的结点,num即为进入这个递归的顺序,专业点好像叫时间戳。
设u的后代为v
判断割点的条件为low[v]>=num[u]
判断割边的条件为low[v]>num[u]

第一题poj1144
POJ1144

这个题的意思其实就是让你求一个图的割点

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#define maxn  1000005
//#define true false
//#define false true
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
const double pi = acos(-1);
typedef long long ll;
const int mod = 1e9 + 7;
using namespace std;
int num[110],low[110];
vector < vector <int> > maps;
bool visited[110];
int dfsnum=0,ans;void init(){   //初始化每组数据memset(num,0,sizeof(num));memset(low,0,sizeof(low));memset(visited,false,sizeof(visited));dfsnum=0,ans=0;;maps.clear();maps.resize(110);
}
void dfs(int u,int fa){num[u]=low[u]=++dfsnum;  //用一个dfsnum来记录每个点进入递归的顺序int child=0;  //一个点的孩子数目for(int i=0;i<maps[u].size();i++){  //遍历u经过的所有子节点int v=maps[u][i];if(num[v]==0){   //如果没有经过此点child++;dfs(v,u);low[u]=min(low[u],low[v]);if(low[v]>=num[u]&&u!=1){visited[u]=true;}}    //如果经过了此点,那么判断通过这个点的父节点的low值是否可以更新为更小的else if(num[v]<num[u]&&v!=fa)  low[u]=min(low[u],num[v]);}   if(u==1&&child>=2)  visited[u]=true;   //出发点的特判
}int main()
{int n,x,y;while(cin>>n&&n){init();while(scanf("%d",&x)&&x){while(getchar()!='\n'){scanf("%d",&y);maps[x].push_back(y);maps[y].push_back(x);}}dfs(1,-1);   //从1开始出发for(int i=1;i<=n;i++)  ans+=visited[i];cout<<ans<<endl;}return 0;
}

2.无向图的双连通分量
这个题作起来需要深度优先搜索生成树的知识点,然后计算的时候利用“缩点”的技术来实现的。缩点很好理解百度一下你就知道
第二题poj3352:
POJ3352
题目大意:就是给定一个无向图,没有重边。问添加几条边才能使无向图变为双连通图。

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#define maxn  20010
//#define true false
//#define false true
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
const double pi = acos(-1);
typedef long long ll;
const int mod = 1e9 + 7;
using namespace std;
int n,m;
vector < vector<int> > maps;
int low[maxn];
int degree[maxn];
int dfsnum=0;
void init(){memset(low,0,sizeof(low));memset(degree,0,sizeof(degree));dfsnum=0;maps.clear();maps.resize(1010);}
void dfs(int u,int fa){low[u]=++dfsnum;for(int i=0;i<maps[u].size();i++){int v=maps[u][i];if(v==fa)  continue;if(!low[v])  dfs(v,u);low[u]=min(low[u],low[v]);}
}int tarjan(){for(int i=1;i<=n;i++){for(int j=0;j<maps[i].size();j++){  //计算缩点的度数if(low[i]!=low[maps[i][j]]) degree[low[i]]++;}}int res=0;for(int i=1;i<=n;i++)  if(degree[i]==1) res++;  //统计缩点为1的个数return res;
}int main()
{while(scanf("%d%d",&n,&m)!=EOF){init();for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);maps[x].push_back(y);maps[y].push_back(x);}dfs(1,-1);int ans=tarjan();printf("%d\n",(ans+1)/2);}return 0;
}

图论-无向图的连通性(POJ1144)(POJ3352)相关推荐

  1. 离散数学 --- 图论基础 --- 无向图的连通性和有向图的连通性

    第一部分 ---- 无向图的连通性 1.完全图:任意两个结点之间都有边 2.零图:所有结点都是孤立结点 3.平凡图:仅有一个结点的图 1.等价类:R是集合上的一个等价关系,选定集合中的任意一个元素a, ...

  2. 图论 —— 图的连通性

    [基本概念] 1.连通图与连通分量 1)连通图:无向图 G 中,若对任意两点,从顶点 Vi 到顶点 Vj 有路径,则称 Vi 和 Vj 是连通的,图 G 是一连通图 2)连通分量:无向图 G 的连通子 ...

  3. tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)

    基本概念 给定无向连通图G = (V, E) 割点: 对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点 割边(桥) 若对于e∈E,从图中删去边e之 ...

  4. 图论专题班连通性例题和练习

    2022牛客 图论 连通性(强连通.割点和桥) 文章目录 2022牛客 图论 连通性(强连通.割点和桥) 概念 双连通分量 强连通分量 tarjan 割点 割边(桥) tarjan求割点,桥 点双联通 ...

  5. 图论 | 无向图 —— 二部图/二分图

    目录 1.二部图概述 1.1.二部图概念 1.2.二部图定理 2.匹配问题 2.1.匈牙利算法 2.1.1.匈牙利树 2.1.2.匈牙利算法 2.1.2.匈牙利算法代码 2.2.KM算法 2.2.1. ...

  6. 模板 - 无向图的连通性

    整理的算法模板合集: ACM模板 目录 tarjan算法求无向图的桥.边双连通分量并缩点 tarjan算法求无向图的割点.点双连通分量并缩点 结论:变成边双连通分量所需要新建的边数 动态求解当前图中的 ...

  7. 图论 —— 图的连通性 —— 传递闭包

    [概述] 传递闭包:对于一个节点 i,如果 j 能到 i,i 能到 k,那么 j 就能到 k,求传递闭包,就是把图中所有满足这样传递性的节点计算出来,计算完成后,就知道任意两个节点之间是否相连. 简单 ...

  8. 图论 —— 图的连通性 —— Tarjan 求双连通分量

    [概念] 1.双连通分量:对于一个无向图,其边/点连通度大于1,满足任意两点之间,能通过两条或两条以上没有任何重复边的路到达的图,即删掉任意边/点后,图仍是连通的 2.分类: 1)点双连通图:点连通度 ...

  9. 图论 —— 图的连通性 —— Tarjan 求割点与桥

    [概念] 1.割点 1)割点:删除某点后,整个图变为不连通的两个部分的点 2)割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 3)点连通度:最小割点集合点数 如上 ...

最新文章

  1. javascript 之clientHeight、scrollHeight、offsetHeight
  2. JUnit 3.8 通过反射测试私有方法
  3. JFrame 居中显示
  4. openresty开发系列38--通过Lua+Redis 实现动态封禁IP
  5. 读取/书写Java的XML格式properties文件
  6. Android 内存泄漏检测工具
  7. 前途,路应该怎么走?
  8. UVA1200 LA2972 POJ2295 ZOJ2492 A DP Problem【输入】
  9. 基类与派生类的类型转换
  10. LINUX编译opencore-amr
  11. 【转】MFC中用CFile读取和写入文件2
  12. linux wps 数学符号,2016版WPS数学符号如何输入
  13. 元宇宙的车,迷你世界上不了
  14. 接口自动化-get/post接口详解
  15. 2019年1月起Oracle要对JDK8就要收费了!
  16. (梳理)用Tensorflow实现SE-ResNet(SENet ResNet ResNeXt VGG16)的数据输入,训练,预测的完整代码框架(cifar10准确率90%)
  17. 经典:智能物联网大数据系统案例
  18. matlab hurst代码,Hurst指数法matlab程序求助
  19. python发短信sim800_玩转 ESP32 + Arduino (十八) 采用SIM800L发送短信和定位(基础知识)...
  20. 网络供电(POE)的功率

热门文章

  1. 聊天机器人之文本分词
  2. python列表用法详解(查找、添加、删除、修改、复制、循环遍历、列表嵌套)
  3. OSI第四层:传输层功能及作用
  4. 笔记 | 那些不得不掌握的卷积神经网络CNN的架构
  5. 基于深度学习的图像边缘和轮廓提取
  6. 目标检测任务中的训练宝典 |实用技巧
  7. Java8 对Map进行排序
  8. 任何社区,只要能影响他人成长的人,都可以成为敏捷个人的荣誉会员
  9. MySQL 5.7 密码策略
  10. checkstyle安装使用