首页 > 其他分享 >强连通分量

强连通分量

时间:2024-07-07 10:30:07浏览次数:11  
标签:连通 读取 记录 int DFS 1010 节点 分量

#include<bits/stdc++.h>
using namespace std;

int n; // 节点数量
int G[1010][1010]; // 图的邻接矩阵表示
int Time,sum; // Time用于记录DFS的时间,sum用于记录强连通分量的数量
int beg[1010],low[1010]; // beg记录每个节点开始被访问的时间,low记录每个节点能够回溯到的最早的节点的时间
stack<int> S;  // 用于DFS的栈
int in_stack[1010];  // 记录每个节点是否在栈中
void DFS(int v); // 深度优先搜索函数

int main(){
	int a,b,m; // a和b用于读取边的两个节点,m用于读取边的数量
	while(scanf("%d",&n)!=EOF){ // 读取节点数量
		scanf("%d",&m); // 读取边的数量
		memset(G,0,sizeof(G)); // 初始化图的邻接矩阵
		for(int i=1;i<=m;i++){ // 读取所有的边
			scanf("%d%d",&a,&b);
			G[a][b]=1; // 在邻接矩阵中添加边
		}
		Time=sum=0; // 初始化时间和强连通分量数量
		memset(beg,0,sizeof(beg)); // 初始化每个节点的开始访问时间
		memset(low,0,sizeof(low)); // 初始化每个节点的最早可达节点的时间
		memset(in_stack,0,sizeof(in_stack)); // 初始化每个节点是否在栈中的标记
		for(int z=1;z<=n;z++){ // 对每个节点进行深度优先搜索
			if(beg[z]==0){
				DFS(z);
			}
		}
		printf("%d\n",sum); // 输出强连通分量的数量
	}
	return 0;
}

void DFS(int v){  // 深度优先搜索函数
	beg[v]=low[v]=++Time; // 初始化每个节点的开始访问时间和最早可达节点的时间
	S.push(v); // 将节点放入栈中
	in_stack[v]=1; // 标记节点在栈中
	
	for(int i=1;i<=n;i++){ // 遍历所有节点
		if(G[v][i]==1){ // 如果存在从v到i的边
			
			if(beg[i]==0){ // 如果节点i还没有被访问过
				DFS(i); // 对节点i进行深度优先搜索
				low[v]=min(low[v],low[i]); // 更新节点v的最早可达节点的时间
			}else if(in_stack[i]==1){ // 如果节点i在栈中
				low[v]=min(low[v],low[i]); // 更新节点v的最早可达节点的时间
			}
		}
	}
	if(beg[v]==low[v]){ // 如果节点v是一个强连通分量的根节点
		int t;
		sum++; // 强连通分量数量加1
		do{
			t=S.top(); // 取出栈顶元素
			S.pop(); // 弹出栈顶元素
			in_stack[t]=0; // 标记节点t已经不在栈中
		}while(t!=v); // 直到弹出的是节点v
	}
}

标签:连通,读取,记录,int,DFS,1010,节点,分量
From: https://www.cnblogs.com/hanlinyuan/p/18288256

相关文章

  • 卡码网刷题一之获取连通的相邻节点列表
     哇丢~~~果然工作后就没时间刷题了,先来个简单的试试水题目描述:在网元内,存在了N个转发节点,每个转发节点有自己唯一的标识TB且每个节点有M个端口,节点间通过端口进行报文通讯。出于业务隔离的需求,服务器内的端口被划分为多个通讯平面(用VLAN隔离,每个VLAN都有一个VLAN......
  • 从时序数据中提取特征分量
     原始数据importmatplotlib.pyplotaspltfrommatplotlibimportfont_managerfname="/usr/local/python3.6/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf"zhfont=font_manager.FontProperties(fname=fname)plt.figure(figsize=(......
  • 连通性分析
    1、脑电连通指标1)基于相干的指标2)基于相位同步的指标3)基于广义同步的指标4)基于格兰杰因果的指标2、基于相干的指标1)相干指标的范围在0~12)局限性:仅能评估两个信号的线性依赖关系,不能检测他们之间的非线性关系;会受到信号波幅的影响;不能分离出容积求导对脑区间连通性的影响3)......
  • 基于方阵的简单电路连通判断算法
    对于一个电路系统中,给定若干个元器件和若干条导线,以及使用导线连接元器件的操作过程,如何判断操作完成后最终某个元器件是否在与电源相连的回路中?实际对于该类问题,无需纠结导线的连接方式与所谓的“回路”,只需判断元器件是否间接或直接与电源正负极相连。本文提出使用方阵存储元......
  • 边三联通分量
    感觉口胡了很多遍的模板算法,快NOI了才想起来写写代码。其实边三的代码很好写,网上许多资料都写麻烦了。边联通性其实是一个很能扩展的东西。两个点之间如果最少要割开\(k\)条边才能使它们之间不联通,称这两个点的边联通度为\(k\)。称两个点之间是\(k\)边联通的,当且仅当这两......
  • PCL 点云聚类(基于体素连通性)
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介这里的思路很简单,我们通过将点云转换为体素,基于体素的连通性实现对点云的聚类(有点类似于欧式聚类),不过这种方式进行的聚类有些粗糙,但聚类速度相对会快很多,具体的实现效果可以详细阅读代码。二、实现......
  • Java实现管线拓扑关系连通性分析
    管线拓扑关系的连通性分析通常涉及图论(GraphTheory)中的概念,特别是无向图(UndirectedGraph)的遍历算法,如深度优先搜索(DFS,Depth-FirstSearch)或广度优先搜索(BFS,Breadth-FirstSearch)。在管线拓扑中,管线可以被视为图的边(Edge),而管线的连接点可以被视为图的节点(Vertex)。连通性分析......
  • Tarjan 求强连通子图
    重温Tarjan,网上看了许多博客感觉都讲的不清楚.故传上来自己的笔记,希望帮到大家.提到的一些概念可以参考oiwiki,代码也是oiwiki的,因为我不认为我能写出比大佬更好的代码了.强连通分量:有向图的最大强连通子图(有向图中任意两点可达)Tarjan对每个结点......
  • Tarjan 求有向图的强连通分量
    重温Tarjan,网上看了许多博客感觉都讲的不清楚.故传上来自己的笔记,希望帮到大家.提到的一些概念可以参考oiwiki,代码也是oiwiki的,因为我不认为我能写出比大佬更好的代码了.强连通分量:有向图的最大强连通子图(有向图中任意两点可达)Tarjan对每个结点维护......
  • 21、docker-网络连通-两个不同网络之间的连通
     语法  测试:dockernetworkconnectmynettomcat-net-01//这里tomcat-net-01容器用的是默认的网络、通过connect连接到了自定义的网络mynet查看mynet网络·连通之后就是将tomcat-net-01放到了mynet网络下 连通之后就可以互相ping通了......