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

联通分量

时间:2024-10-11 16:34:04浏览次数:1  
标签:联通 int len st low 分量

点双:在一个联通块中删去任意一个点后剩下的点仍然能构成联通块,则此联通块叫做点双联通分量。(两个点是一个点双)

性质:任意两点间可构造出两条不相交路径(除起点和终点外不重复经过其他点)。

割点:在一联通块中删去一点可使剩下的点不联通,则此点叫做割点。

一个点可能在多个点双里。


边双:在一个联通块中删去任意一条边后剩下的点仍然能构成联通块,则此联通块叫做边双联通分量。(一个点是一个边双,两个点不是一个边双)

性质:任意两点间可构造出两条不相交路径(不重复经过其他边)。

割边(桥):在一联通块中删去一边可使剩下的点不联通,则此边叫做割边。

一个点只能在一个边双里。


点双和边双都是对于无向图而言的。


强联通分量:任意两个点可以两两到达的图是强联通的。

强联通分量不存在交点。

对于每个强联通分量进行缩点后会形成一张 DAG。

强联通分量是对于有向图而言的。


搜索树

从一个点开始进行 DFS,最终得到一棵生成树,这棵树叫搜索树。在该搜索树上的边叫树边。

返祖边:原图中节点连向搜索树中祖先节点的边。


tarjan 求强联通分量(B3609

#include<bits/stdc++.h>
using namespace std;
const int N=11451,M=114514;
struct node{
	int to,next;
}e[M];
int h[N],cnt;
int n,m;
int dfn[N],low[N],tot,ans;
//dfn dfs序 low 子树能追溯最早的栈中节点 
int f[N];//属于哪个强联通分量 
int st[N],len;
bool vis[N],flag[N];
vector<int> ansv[N];
void Link(int u,int v){
	e[++cnt].to=v;
	e[cnt].next=h[u];
	h[u]=cnt;
}
void tarjan(int x){
	dfn[x]=low[x]=++tot;
	st[++len]=x;
	vis[x]=true;
	for(int i=h[x],y;i;i=e[i].next){
		y=e[i].to;
		if(!dfn[y]){//未被访问过
			tarjan(y);//dfs
			low[x]=min(low[x],low[y]);//用子节点的low更新
		}else if(vis[y]){//被访问过且在栈中(返祖)
			low[x]=min(low[x],dfn[y]);//用其dfs序更新
		}//否则就是访问过但已出栈,这是已操作完的节点,无需访问
	}
	if(dfn[x]==low[x]){//是所在的强联通分量中根
		ans++;//其间所有节点构成该强联通分量
		ansv[ans].push_back(x);
		while(st[len]!=x){
			ansv[ans].push_back(st[len]);//退栈
			vis[st[len]]=false;
			f[st[len]]=ans;
			len--;
		}
		vis[x]=false;
		f[x]=ans;
		len--;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1,u,v;i<=m;i++){
		cin>>u>>v;
		Link(u,v);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])tarjan(i);//确保没有没被访问的节点
	for(int i=1;i<=ans;i++)
		sort(ansv[i].begin(),ansv[i].end());
	cout<<ans<<endl;//输出答案
	for(int i=1;i<=n;i++){
		if(!flag[f[i]]){
			flag[f[i]]=true;
			for(int j=0;j<ansv[f[i]].size();j++)
				cout<<ansv[f[i]][j]<<' ';
			cout<<endl;
		}
	}
	return 0;
}

例题:P3387 【模板】缩点

思路:将强联通分量进行缩点操作,因为强联通分量中各点之间相互可达,所以可以合并权值。缩点后原图变为 DAG,可以通过拓扑排序求最大和。

#include<bits/stdc++.h>
using namespace std;
const int N=11451,M=114514;
struct node{
	int to,next;
}e[M];
int h[N],cnt;
int n,m,a[N];
int dfn[N],low[N],tot;
int f[N],w[N],s;
//f 所属联强联通分量  w 强联通分量权值 s 个数 
int st[N],len;
int in[N],pre[N],ans;//pre 前置节点中最大权值 
bool vis[N];
vector<int> v[N];
void Link(int x,int y){
	e[++cnt].to=y;
	e[cnt].next=h[x];
	h[x]=cnt;
}
void tarjan(int x){//缩点 
	dfn[x]=low[x]=++tot;
	st[++len]=x;
	vis[x]=true;
	for(int i=h[x],y;i;i=e[i].next){
		y=e[i].to;
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}else if(vis[y]){
			low[x]=min(low[x],dfn[y]);
		}
	}
	if(dfn[x]==low[x]){
		s++;
		f[x]=s;//加入强联通分量 
		w[s]+=a[x];//合并权值 
		vis[x]=false;
		while(st[len]!=x){
			f[st[len]]=s;
			w[s]+=a[st[len]];
			vis[st[len]]=false;
			len--;
		}
		len--;
	}
}
void topsort(){//拓扑排序 
	queue<int> q;
	for(int i=1;i<=s;i++)
		if(!in[i])q.push(i);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		ans=max(ans,w[x]+=pre[x]);//更新答案 前面来的+此强联通分量的 
		for(int i=0,y;i<v[x].size();i++){
			y=v[x][i];
			pre[y]=max(pre[y],w[x]);//更新 pre 
			in[y]--;
			if(!in[y])q.push(y);
		}
	}
} 
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1,x,y;i<=m;i++){
		cin>>x>>y;
		Link(x,y);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])tarjan(i);
	for(int x=1;x<=n;x++){
		for(int i=h[x],y;i;i=e[i].next){
			y=e[i].to;
			if(f[x]!=f[y]){//注意是缩完后的点之间连边 
				v[f[x]].push_back(f[y]);//here 
				in[f[y]]++;//here
			}
		} 
	}
	topsort();
	cout<<ans;
	return 0;
} 

标签:联通,int,len,st,low,分量
From: https://www.cnblogs.com/z-Sqrt-xf/p/18458731/lian-tong-fen-liang

相关文章

  • 福建联通吉比特H80g进telnet获取超级密码改桥接
    本人博客原文链接:福建联通吉比特H80g进telnet获取超级密码改桥接最近福建联通宽带换了一个光猫,型号是吉比特H80G,自己尝试了获取管理员密码,大致流程是:1、记录自己的loid、宽带帐号、密码等配置信息;2、长按光猫reset键回复出场设置,此时管理员账户和密码是CUAdminCUAdmin,在高级......
  • matlab-对比两张图片的Ycbcr分量的差值并形成直方图
    %对比两张图片的Ycbcr分量的差值并形成直方图,改个路径就能用,图片分辨率要一致closeall;clearall;clc;I1=imread('E:\test\resources\image\1.jpg');I2=imread('E:\test\resources\image\2.jpg');ycbcr1=rgb2ycbcr(I1);ycbcr2=rgb2ycbcr(I2);%提取色度分量,Y(亮......
  • GBase数据库支持河北联通绘制智慧运营蓝图
    项目背景随着移动互联网的不断发展、智能终端迅速普及,以及移动数据流量迅猛增长,流量经营已是河北联通战略转型的重点,而流量经营的先决条件是经分系统的可持久运行。面对海量的网络数据规模,传统经分系统的数据存储、数据处理和数据分析显然无法满足河北联通日益发展的数据处理要求;同......
  • GBase数据库支撑湖南联通构建高效融合大数据平台
    项目背景湖南联通通过建设大数据平台实现服务对外开放,为内外部开发者提供数据组装,运用大数据平台分析能力,从服务器中的海量数据中提取行业、企业感兴趣的内容,实现对湖南联通全网用户数据的整合、分析和输出,在确保数据信息安全保密的前提下,向公安、交通、旅游、政府等行业提供各类数......
  • GBASE南大通用赋能北京联通,打造高效流媒体日志查询平台
    项目背景北京联通宽带业务中心在IPV6流媒体系统升级改造完成的基础上,需要进一步实现对用户访问信息的统计,达到深度分析用户访问行为,快速定位故障、快速响应联通客户投诉,提升客户满意度的目的,并为经营分析、营销及运维提供高价值的数据支持。宽带业务中心各类系统每天产生大量的非结......
  • 割边和边双联通分量
    割边(Bridge)在图论中,割边(Bridge)是指在一个无向图中,如果删除某条边会导致图的连通分量数量增加,那么这条边就被称为割边。换句话说,割边是连接两个不同连通分量的边。性质连通性:删除割边会使得图的连通性降低,即原本连通的节点变得不连通。无向图:割边的概念主要应用于无向图。桥......
  • 强联通分量——Tarjan算法
    Tarjan算法详解参考文章:强连通分量Tarjan算法是一种用于寻找有向图中强联通分量(StronglyConnectedComponents,SCCs)的算法。它是由RobertTarjan在1972年提出的,基于深度优先搜索(DFS)和栈的数据结构。基本概念强联通分量:在一个有向图中,如果一组节点中任意两个节点都可以互相......
  • 软件供应链安全管理实践之中国联通
    软件供应链安全管理是保护软件开发和交付过程中所有组件的安全性和完整性的重要环节,软件供应链安全国家标准及政策的发布,为企业软件供应链安全管理提供了依据。本文摘选自软件供应链安全推进工作组指导、苏州棱镜七彩信息科技有限公司主笔的《2023软件供应链安全研究报告》中第八章......
  • 中国联通国际(联通云)-绿色低碳,共筑可持续发展未来
    在数字化浪潮席卷全球的今天,数据的安全与智能应用的无限潜力成为了企业转型与创新的关键驱动力。中国联通国际有限公司,凭借其强大的全球网络资源和深厚的技术积累,隆重推出旗下云服务品牌——联通云,旨在为全球数百万企业和开发者打造一个安全可靠、云网一体、数智相融、专属定制、......
  • 联通国际(海外)数据中心资源-提供全球热门地区的数据中心解决方案
    在全球化日益加深的今天,企业对于高效、可靠的数据中心解决方案的需求比以往任何时候都要强烈。为了帮助企业更好地拓展海外市场,中国联通国际有限公司推出了其专业的海外数据中心资源服务。这一服务旨在通过提供全球热门地区的电信级数据中心解决方案,为客户的国际化战略保驾护航。......