图论--强连通分量

这篇具有很好参考价值的文章主要介绍了图论--强连通分量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

描述

给出一个有向图,求该图的强连通分量的个数。

输入描述

多测试用例,每个测试用例:

第一行给出顶点数 n ( 1 ≤ n ≤ 1000 )

第二行给出边数 e ( 0 ≤ e ≤ 100000 )

第三行开始,共 e 行,每行两个正整数 a b,表示从顶点 a 发出一条弧到顶点 b 。

输出描述

每个测试用例一行结果,一个正整数:该有向图的强连通分量的个数。

关于这道题,首先我们要知道什么是强连通分量:(from百度)有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。

一道简单的oj题,话不多说,上代码:文章来源地址https://www.toymoban.com/news/detail-538887.html

#include<stack>
#include<cstring>
#include<iostream>
using namespace std;
stack<int> s;
int b[1005];//判断结点有没有走
int a[1005][1005],a1[1005][1005];//邻接矩阵
void init(int m);
void jisuan1(int t,int n);
void jisuan2(int t,int n); 
int main(){
	int n,m;//结点数,边数
	while(scanf("%d\n%d",&n,&m)!=EOF){
		init(m);
		while(!s.empty())
       		s.pop();
		memset(b,0,sizeof(b));	
		int i,sum=0;//sum为强连通量的个数 
		for(i=1;i<n+1;i++)
			if(b[i]==0) jisuan1(i,n);
		memset(b,0,sizeof(b));
		while(!s.empty()){
			int t;
			t=s.top();
			s.pop();
			if(b[t]==0){
				sum++;
				jisuan2(t,n);
			}
		}
		cout<<sum<<endl;
	} 
	return 0;
} 
void init(int m){
	//初始化两个邻接矩阵 
	memset(a,0,sizeof(a));
	memset(a1,0,sizeof(a1));
	int i,a2,b2;
	for(i=1;i<m+1;i++){
		cin>>a2>>b2;
	    a[a2][b2]=1;
		a1[b2][a2]=1;		
	 }
}
void jisuan1(int t,int n){
	int i;
	b[t]=1;
	for(i=1;i<n+1;i++)
		if(a[t][i]==1&&b[i]==0)
			jisuan1(i,n);
	s.push(t);
}
void jisuan2(int t,int n){
	int i;
	b[t]=1;
	for(i=1;i<n+1;i++)
		if(a1[t][i]==1&&b[i]==0)
			jisuan2(i,n);
}

到了这里,关于图论--强连通分量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 有向图的强连通分量

    对于一个有向图,连通分量:对于分量中任意两点u,v,必然可以从u走到v,且从v走到u. 强连通分量:极大连通分量。 求出强连通分量后,可以通过将强连通分量缩点的方式,将有向图转化成有向无环图。 求强连通分量的方法:tarjan O(n+m),时间复杂度是线性的 1 . 采用dfs来遍历整

    2024年02月10日
    浏览(39)
  • 图的基本概念辨析,包括连通图、极大连通子图、连通分量、强连通图、极大强连通子图等

    概念(1-4)都是针对无向图的   图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连通着的。例如图 1 中,虽然 V1 和 V3 没有直接关联,但从 V1 到 V3 存在两条路径,分别是 V1-›V2-›V3 和 V1-›V4-›V3,因此称 V1 和 V3 之间是连通的。 图 1 顶点之间的连

    2024年02月15日
    浏览(59)
  • 有向图的强连通分量算法

    有向图的强连通分量算法 强连通分量定义 在有向图中,某个子集中的顶点可以直接或者间接互相可达,那么这个子集就是此有向图的一个强连通分量,值得注意的是,一旦某个节点划分为特定的强连通分量后,此顶点不能在其它子树中重复使用,隐含了图的遍历过程和极大

    2024年02月06日
    浏览(84)
  • 团体程序设计天梯赛 L2-013 红色警报(连通分量)

    分数 25 战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出

    2024年03月13日
    浏览(52)
  • 第三章 图论 No.10无向图的双连通分量

    无向图有两种双连通分量 边双连通分量,e-DCC 点双连通分量,v-DCC 桥:删除这条无向边后,图变得不连通,这条边被称为桥 边双连通分量:极大的不含有桥的连通区域,说明无论删除e-DCC中的哪条边,e-DCC依旧连通 (该连通分量的任意边属于原图中的某条环)。此外,任意两

    2024年02月12日
    浏览(39)
  • C++图论之强连通图

    什么是连通性? 连通,字面而言,类似于自来水管道中的水流,如果水能从某一个地点畅通流到另一个地点,说明两点之间是连通的。也说明水管具有连通性,图中即如此。 无向图和有向图的连通概念稍有差异。 无向图连通性 如果任意两点间存在路径,称此图具有连通性

    2024年02月03日
    浏览(38)
  • 【图论】无向图连通性(tarjan算法)

    1. 连通 : 在图论中,连通性是指一个无向图中的任意两个顶点之间存在路径。如果对于图中的任意两个顶点 u 和 v,存在一条路径从 u 到 v,那么图被称为连通图。如果图不是连通的,那么它可以被分为多个 连通分量 ,每个连通分量都是一个连通子图。 2.割点: 割点(Cut V

    2024年02月13日
    浏览(44)
  • C++ 图论之求图的连通块数量(邻接矩阵版)

    1. 连通块的定义 块内每个点之间都有一条路径。 2. 思路 我们可以用dfs深度优先搜索:从一个点出发遍历图将遍历过的点全部标记,标记过的点则不会再遍历到。 再写一个循环枚举所有的点(枚举起点),如果没标记就代表可以作为起点,数量加一,进行dfs标记点。 3. 代码

    2024年02月13日
    浏览(52)
  • 导行电磁波从纵向场分量求其他方向分量的矩阵表示

    电磁波在均匀、线性、各向同性的空间中沿着 z z z 轴传播,可用分离变量法将时间轴、 z z z 轴与 x , y x,y x , y 轴分离,电磁波的形式可表示为: E ⃗ = E ⃗ ( x , y ) e − γ z e j ω t H ⃗ = H ⃗ ( x , y ) e − γ z e j ω t begin{align} vec E=vec E(x,y) textrm e^{-gamma z} textrm e^{jomega t}\\\\ v

    2024年02月04日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包