首页 > 其他分享 >边三联通分量

边三联通分量

时间:2024-07-03 09:33:16浏览次数:14  
标签:联通 树边 割集 int 异或 权值 分量

感觉口胡了很多遍的模板算法,快 NOI 了才想起来写写代码。其实边三的代码很好写,网上许多资料都写麻烦了。

边联通性其实是一个很能扩展的东西。两个点之间如果最少要割开 \(k\) 条边才能使它们之间不联通,称这两个点的边联通度为 \(k\)。称两个点之间是 \(k\) 边联通的,当且仅当这两个点的边联通度 \(\ge k\)。

边联通性具有很好的传递性。即若 \(x,y\) 是 \(k\) 边联通的,\(y,z\) 是 \(k\) 边联通的,那么 \(x,z\) 是 \(k\) 边联通的。证明考虑假设一个大小 \(<k\) 的边集割开了 \(x,z\),那么这个割集势必没有割开 \(x,y\) 和 \(y,z\),此时 \(x,z\) 仍联通矛盾。\(k\) 边联通分量就是把 \(k\) 边联通的点连边形成的连通块。由上面的传递性我们可以知道边联通分量中的点两两 \(k\) 边联通。

这件事告诉我们了 \(k\) 边联通分量总是可以被良好定义且结构优美的,但是点联通分量光是在 \(k=2\) 的时候就略显丑陋——有可能一个点在多个点双中。

如何判断 \(k\) 边联通性呢?我们考虑一个比较通用的问题:给定一张图的 \(k\) 条边,问其是否是边割集。

做法是考虑经典的割空间与环空间。极小的边割集定义为对于一个边割集加回其中一条边后,图的联通性有变化,或者说你考虑把图仍以分成两个部分,那么跨过这两个部分的边组成一个极小的边割集。一个图的割空间是一个由所有极小的边割集组成的线性空间,即其在对称差(异或)运算下封闭。一个图的回路空间也是线性空间(回路指每个连通块都有欧拉回路的边集,也就是每个点均与其中的偶数条边相邻)。这两个空间互为正交补,即边割集与回路的公共部分一定大小为偶数,且与一个回路公共部分大小为偶数的一定是边割集。

由一些经典结论我们知道只用非树边和树边形成的简单环异或就可以得到所有的环。所以判定一个边集是不是极小的边割集可以异或哈希给非树边随机赋权,然后让树边的权值等于所有覆盖它的非树边权值的异或。这样如果一个边集权值异或和为 0,说明其与某个回路正交。

判断一个集合是否是边割集就是看存不存在一个非空子集是极小边割集,那么就是问这个集合的权值是不是线性相关。

现在对于 \(k=3\) 的情况,我们应用这个技巧给边随机赋权。那么一个点集边三联通相当于其中所有边的大小不超过三的子集线性不相关。线性相关无非这么几种情况:

  • 存在一条树边边权为 0。即这条边是割边,在三联通分量中我们需要割开这条树边。

  • 存在一个树边和非树边权值相等。我们也需要割开这条树边。

  • 存在两条树边权值相等。此时中间的部分需要跟两边的部分隔开。

发现我们要做一个分割连通块的操作,一种方法是 dfs 打标记,但这样细节还是不够少。我发现 tzc_wk 博客里的方法是又好写又好记。我们同样采用异或哈希的手法,一个连通块需要跟其它部分分开相当于这个连通块需要全体异或上一个与众不同的值。那么对于前两种情况,打一个子树异或标记,对于第三种一上一下打两个子树异或标记,就可以区分出中间的连通块。

由于是 dfs 树,非树边一定直上直下,那么所有权值相等的树边肯定排列在一条直上直下的树链上,显然我们只需要处理这条链上相邻的两条边就够了。我们只需要开个全局 Hash 表,在 dfs 回溯时找到子树中第一条跟它权值相同的边处理第三种情况。

只需要两次 dfs。如果你选择多跑一次 tarjan 处理第一种情况有点多此一举了。

#include <cstdio>
#include <random>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace std;
mt19937_64 rng(random_device{}());
typedef unsigned long long ull;
int read(){
	char c=getchar();int x=0;
	while(c<48||c>57) c=getchar();
	do x=x*10+(c^48),c=getchar();
	while(c>=48&&c<=57);
	return x;
}
int n,m;
const int N=500003;
int hd[N],ver[N<<1],nxt[N<<1],tot=1;
void add(int u,int v){nxt[++tot]=hd[u];hd[u]=tot;ver[tot]=v;}
int dfn[N],num;
ull w[N],eq[N];
typedef vector<int> vi;
__gnu_pbds::gp_hash_table<ull,int> mp,id;
__gnu_pbds::gp_hash_table<ull,bool> exi;
vector<vi> res;
bool ontr[N<<1],rt[N];
void dfs(int u,int las){
	dfn[u]=++num;
	for(int i=hd[u];i;i=nxt[i]){
		int v=ver[i];
		if(i==las) continue;
		if(dfn[v]){
			if(dfn[v]<dfn[u]){
				ull val=rng();
				w[u]^=val;
				w[v]^=val;
				exi[val]=1;
			}
		}
		else{
			ontr[i]=1;
			dfs(v,i^1);
			w[u]^=w[v];
		}
	}
	if(exi.find(w[u])!=exi.end()) eq[u]^=rng();
	else{
		auto it=mp.find(w[u]);
		if(it!=mp.end()){
			ull val=rng();
			eq[it->second]^=val;
			eq[u]^=val;
			it->second=u;
		}
		else mp[w[u]]=u;
	}
}
void split(int u){
	for(int i=hd[u];i;i=nxt[i])
		if(ontr[i]){
			int v=ver[i];
			eq[v]^=eq[u];
			split(v);
		}
	if(id.find(eq[u])!=id.end()) 
		res[id[eq[u]]].emplace_back(u);
	else{
		id[eq[u]]=res.size();
		res.emplace_back(1,u);
	}
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;++i){
		int u=read(),v=read();
		add(u,v);add(v,u);
	}
	exi[0]=1;
	for(int i=1;i<=n;++i)
		if(!dfn[i]){
			eq[i]^=rng();
			dfs(i,0);
			rt[i]=1;
		}
	for(int i=1;i<=n;++i) if(rt[i]) split(i);
	for(vi &cur:res) sort(cur.begin(),cur.end());
	sort(res.begin(),res.end());
	printf("%lu\n",res.size());
	for(vi cur:res){
		for(int x:cur) printf("%d ",x);
		putchar('\n');
	}
	return 0;
}

标签:联通,树边,割集,int,异或,权值,分量
From: https://www.cnblogs.com/yyyyxh/p/18280891/3edge_connectivity

相关文章

  • Tarjan 求有向图的强连通分量
    重温Tarjan,网上看了许多博客感觉都讲的不清楚.故传上来自己的笔记,希望帮到大家.提到的一些概念可以参考oiwiki,代码也是oiwiki的,因为我不认为我能写出比大佬更好的代码了.强连通分量:有向图的最大强连通子图(有向图中任意两点可达)Tarjan对每个结点维护......
  • 联通主机托管:高容量、灵活配置
    ​ 在当今数字化快速发展的时代,数据中心的稳定性和效率对于企业的运营至关重要。联通主机托管服务正是为了满足这一需求而诞生的,它为客户提供了运营商级机房环境存放主机设备及运维管理,帮助客户实现高效、稳定的数据处理与存储。联通主机托管服务不仅提供空间租赁、高速数据端......
  • 联通算力运力解决方案能够加速模型的训练和推理过程
    随着数字化时代的深入发展,算力已成为推动社会进步和产业升级的关键力量。为满足不同行业对算力的多样化需求,联通凭借其在通信技术领域的深厚积累,推出了融合算力、算商、算法、数据、应用的综合性算网生态——联通算力运力解决方案。这一方案不仅提供了广泛辐射不同行业应用的算网......
  • 【导航定位】卡尔曼滤波kalman GPS和惯性船舶组合导航(弧长 速度分量 航向 航向变化率
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。......
  • 通过联通IP Transit产品实现快速、高效的网络连接和内容传播。
    联通IPTransit产品依托中国联通在全球范围内的AS4837/AS10099网络平台,采用BGP对接技术,为客户自有的IP地址段提供全球互联网络穿透服务。通过这一产品,客户可以享受到专属带宽带来的优质访问体验,快速、高效地将网络数据内容接入互联网骨干网络,为数据内容提供大量访问流量。产品优......
  • 图论-割边与边双连通分量
    首先是两篇模板割边点击查看代码inthead[N],cnt=1;structEdge{intfrom,to,nxt;}e[N<<1];voidadd(intu,intv){e[++cnt].from=u;e[cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;}intdfn[N],back[N],tim,bri_cnt;//dfn......
  • 图论-割点与点双连通分量
    首先是两篇的代码割点点击查看代码inthead[N],cnt=0;structEdge{intfrom,to,nxt;}e[N<<1];voidadd(intu,intv){e[++cnt].from=u;e[cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;}intdfn[N],back[N],tim;//dfn[i]时......
  • 直流分量2
    直流分量的并网标准理论上,逆变器只只输出交流电,而实际上,电流中会夹杂着少量的直流分量,这些直流分量会对电网设备造成严重危害。随着新能源产业的迅猛发展,世界各国也随之陆续出台了诸多的相关技术要求对于隔离型光伏并网系统中允许最大直流电流额定电流的1%对于非隔离型光伏并网系......
  • 直流分量1
    1.直流分量直流分量是指交流电信号中的直流成分。通常情况下,交流电信号是由振荡的正弦波组成,其频率在一个周期内变化。然而,某些情况下,电路中可能存在直流偏移或直流成分,使得交流信号不再纯粹是一个对称的振荡波形。直流分量可以被认为是交流信号在零线上的偏移或直流电平。它可......
  • 仓储物流:中国联通国际的一站式信息化解决方案
    仓储物流行业作为现代经济体系中的重要一环,其信息化建设的步伐不断加快,对于网络、数据和技术的需求也日益增长。中国联通国际凭借其丰富的经验和全球资源,通过专业组网、网络专线以及互联网接入等多元化服务,为仓储物流行业提供了一站式信息化解决方案,充分满足了客户对信息化建设的......