HIHO #1184 : 连通性二·边的双连通分量

2024-08-30 20:08

本文主要是介绍HIHO #1184 : 连通性二·边的双连通分量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

Tarjan算法,介绍可以看题目讲解,很好很清楚

无向图边的双联通分量的定义:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通性,这样的子图叫做边的双连通子图。而当子图的边数达到最大时,叫做边的双连通分量。

或者说,对于一个连通图,如果任意两点至少存在两条”边不重复”的路径。也就是要去每条边至少在一个简单的环中,也就是说所有的边都不是桥

同样是2个方法:
1)题目伪代码实现
2)优化版

#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define gcd __gcd#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)const int maxn = 2e4+2000;
const int inf  = 1 << 28;int n,m;
vector<int> G[maxn];int fa[maxn],low[maxn],dfn[maxn],stk[maxn];
bool vis[maxn];
int top,counter;int cnt;
int ans[maxn];
int belong[maxn];void dfs(int u){vis[u]=true;dfn[u]=low[u]=++counter;stk[top++]=u;for(int i=0;i<G[u].size();i++){int v = G[u][i];if(!vis[v]){fa[v]=u;dfs(v);low[u]=min(low[u],low[v]);}else if(v!=fa[u]){low[u]=min(low[u],dfn[v]);}}if(low[u]==dfn[u]){do{int x = stk[--top];belong[x] = cnt;if(ans[cnt]==0)ans[cnt]=x;ans[cnt]=min(ans[cnt],x);}while(stk[top]!=u);cnt++;}
}void init(int n){top = counter = cnt = 0;for(int i=0;i<=n;i++){fa[i]=-1;vis[i]=dfn[i]=low[i]=0;G[i].clear();}
}int main(){cin>>n>>m;init(n);for(int i=0;i<m;i++){int x,y;cin>>x>>y;G[x].pb(y);G[y].pb(x);}dfs(1);cout<<cnt<<endl;for(int i=1;i<=n;i++){if(i==1)cout<<ans[belong[i]];else cout<<' '<<ans[belong[i]];}cout<<endl;return 0;
}

2)

#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define gcd __gcd#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)const int maxn = 2e4+2000;
const int inf  = 1 << 28;int n,m;
vector<int> G[maxn];int low[maxn],dfn[maxn],stk[maxn];
int top,counter;int cnt;
int ans[maxn];
int belong[maxn];void dfs(int u,int fa){dfn[u]=low[u]=++counter;stk[top++]=u;for(int i=0;i<G[u].size();i++){int v = G[u][i];if(v==fa)continue;if(!dfn[v]){dfs(v,u);low[u]=min(low[u],low[v]);}else{low[u]=min(low[u],dfn[v]);}}if(low[u]==dfn[u]){do{int x = stk[--top];belong[x] = cnt;if(ans[cnt]==0)ans[cnt]=x;ans[cnt]=min(ans[cnt],x);}while(stk[top]!=u);cnt++;}
}void init(int n){top = counter = cnt = 0;for(int i=0;i<=n;i++){dfn[i]=low[i]=0;G[i].clear();}
}int main(){cin>>n>>m;init(n);for(int i=0;i<m;i++){int x,y;cin>>x>>y;G[x].pb(y);G[y].pb(x);}dfs(1,1);cout<<cnt<<endl;for(int i=1;i<=n;i++){if(i==1)cout<<ans[belong[i]];else cout<<' '<<ans[belong[i]];}cout<<endl;return 0;
}

这篇关于HIHO #1184 : 连通性二·边的双连通分量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121802

相关文章

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

像素间的关系(邻接、连通、区域、边界、距离定义)

文章目录 像素的相邻像素4邻域D邻域8邻域 邻接、连通、区域和边界邻接类型连通区域边界 距离测度欧氏距离城市街区距离(city-block distance)棋盘距离(chessboard distance) 参考 像素的相邻像素 4邻域 坐标 ( x , y ) (x,y) (x,y)处的像素 p p p有2个水平的相邻像素和2个垂直的相邻像素,它们的坐标是: ( x

OpenCV结构分析与形状描述符(6)带统计的连通组件计算函数connectedComponentsWithStats()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 connectedComponentsWithStats 函数计算布尔图像的连通组件标记图像,并为每个标记产生统计信息。 该函数接受一个具有4或8连通性的二值图像,并返回 N,即标签总数(标签范围为 [0, N-1],其中 0 代表背景标签)

最小连通网络

使用网络中的n-1条边来连接网络中的n个顶点 不产生回路 各边上的权值总和达到最小 prim算法:针对顶点展开,适合边的数量较多的情况 kruskal算法:针对边展开的,适合边的数量较少的情况

nc -s网络连通性测试

例如: nc -s 192.168.82.67 192.168.82.66 22 在这个命令中,您使用了nc(Netcat)工具来进行网络连接。下面是命令的详细说明: nc: 表示使用Netcat工具进行操作。-s 192.168.82.67: 指定源IP地址为192.168.82.67。这个参数让Netcat使用指定的IP地址进行网络连接,而不是默认的地址。192.168.82.66:

【HDU】2242 考研路茫茫——空调教室 双连通分量+树型DP

考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1978    Accepted Submission(s): 576 Problem Description 众所周知,HDU的考研教室是没

【HDU】3861 The King’s Problem 强连通缩点+有向图最小路径覆盖

传送门:【HDU】3861 The King’s Problem 题目分析:首先强连通缩点,因为形成一个环的王国肯定在一条路径中,这样才能保证拆的少。 然后缩点后就是DAG图了,由于题目要求的是最小路径覆盖,那么二分匹配即可。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>#includ

【Live Archive】6393 Self-Assembly【强连通】

传送门:【Live Archive】6393 Self-Assembly 题目分析: 假设我们只用到向上或者向右的块,这样我们只要找到一个回路使得某个块可以和第一个块一样,那么我们就相当于找到了一个循环,这样就可以无限循环了。 但是我们要怎样去找这么一个环?考虑到必须是对应字母 X+,X− X^+,X^-才能建边,然后一个环中一定是多个一对一对的这样的对应字母组成的。 可以发现块的数量那么

OpenCV_连通区域分析(Connected Component Analysis-Labeling)

申明:本文非笔者原创,原文转载自:http://blog.csdn.net/icvpr/article/details/10259577 OpenCV_连通区域分析(Connected Component Analysis/Labeling) 【摘要】 本文主要介绍在CVPR和图像处理领域中较为常用的一种图像区域(Blob)提取的方法——连通性分析法(连通区域标

强连通分量专题总结

~~~~~      总题单链接 ~~~~~      对于只需要考虑强连通分量的题,就可以用强连通分量(大雾 ~~~~~      我想了很久,确实没有什么好说的 … \ldots …