【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)_kosaraju算法代码-程序员宅基地

技术标签: dfs  算法  数据结构  

代码:

typedef struct anode {
    
    int adjvex;//该边的邻接点编号
    struct anode* nexarc;//指向下一条边的指针
    int weight;//该边的相关信息,比如权值
}arcnode;//边结点类型
typedef struct vnode {
    
    //InfoTyoe info; 顶点的其他信息
    arcnode* firstarc;//指向第一个边结点
}Vnode;//邻接表头结点类型
typedef struct {
    
    vnode adjlist[10000];//邻接表头结点数组
    int n, e;//图中顶点数n和边数e
}adjgraph;//完整的图邻接表类型
#define INF 1e6; 
#define maxn 1000; 
int visited[maxn];
stack<int>st;//全局栈,存放逆拓扑序列
void create(adjgraph*g,int A[8][8],int n,int e)
{
    
	g->e = e;
	g->n = n;
	arcnode*q;
	for(int i = 0;i < n;i++)
	for(int j = 0;j < n;j++)
	{
    
		if(A[i][j] != INF && i != j)
		{
    
			g->adjlist[i].firstarc->weight = A[i][j];
q = (arcnode*)malloc(sizeof(arcnode));
q->adjvex = j;
q->nexarc = g->adjlist[i].firstarc;//头插法
g->adjlist[i].firstarc = q;


		}
	}
}
void createReAdj(adjgraph*g,adjgraph*g2){
    
	//产生逆邻接表
	arcnode*q,*p;
	int i,w;

	g2 = (adjgraph*)malloc(sizeof(adjgraph));
	g2->n = g->n;
	for(int i = 0;i < g->n;i++)
	g2->adjlist[i].firstarc = NULL;
		for(int i = 0;i < g->n;i++)
		{
    
			p = g->adjlist[i].firstarc;
			while (p != NULL)
			{
    
			w = p->adjvex;//如果原图存在(i,w)
			q = (arcnode*)malloc(sizeof(arcnode));
			q->adjvex = i;
			q->weight = p->weight;
			q->nexarc = g2->adjlist[w].firstarc;
			g2->adjlist[w].firstarc = q;//生成一条(w,i)边
			
		p = p->nexarc;
			}
	
		}
}
//深度递归1 产生一个逆拓扑序列
void dfs1(adjgraph*g, int u)
{
    
	visited[u] = 1;
	//从u出发深度搜索
	arcnode* q;
	q = g->adjlist[u].firstarc;//指向u的第一个邻接点

while(q){
    
	int num = q->adjvex;
		if(visited[num]!=1)
		dfs1(g,num);
	q = q->nexarc;//指向下一个邻接点
		
	
	}
	st.push(u);//最后一步才将u入栈

}
//深度递归2 用于求一个强连通分量 ,其中一个数组component即一个强连通分量
void dfs2(adjgraph* g,int v,vector<int>&component)
{
    
	int w;
	arcnode*p;
	visited[v] = 1;
	p = g->adjlist[v].firstarc;
		component.push_back(num);
			st.pop();//每次递归都出栈中的一个元素,直到最后栈为空
	while(p)
	{
    
		int num = p->adjvex;
	
		if(!visited[num])
		{
    
		
		dfs2(g,num,component);
		}
		p = p->nexarc;
	}
}
void Kosaraju(adjgraph*g)
{
    
	//求g的强连通分量
	adjgraph*g1;
	vector<int>com;
	memset(visited,0,sizof(visited));
	for(int i = 0;i < g->n;i++)
	if(st.size() != g->n)//当st中元素个数小于顶点数目时
	dfs1(g,i);//第一步首先递归产生逆拓扑序列
	memset(visited,0,sizeof(visited));//再次恢复visited为未访问
	createReAdj(g,g1);//产生逆邻接表
	while(!st.empty())
	{
    
		//栈不空时循环
		int top1 = st.top();//取栈顶
		com.clear();//每次都清空vector数组
		print("顶点%d的强连通分量",top1);
		dfs2(g,top,com);
		for(int i = 0;i < com.size();i++)
		cout<<com[i]<<" ";//输出一个强连通分量
		cout<<endl;
	}
	detroy(g1);//销毁g1
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41358574/article/details/118518116

智能推荐

毕设仿真分享 单片机非接触式红外感应体温计-程序员宅基地

文章浏览阅读311次,点赞9次,收藏7次。非接触式电子体温计主要利用红外测温原理,一切温度高于绝对零度(-273.35℃)的物体,由于分子热运动,物体会不停地向外辐射能量。物体辐射能量的大小与它的表面温度有十分密切的关系。因此,通过测量物体辐射的能量,就能够测量出物体的温度。本用户手册中的非接触式电子体温计就是利用这种测量方法,实现测量人体体温的功能。

Vista/Win7下普通权限进程动态提升权限_findwindow 没有权限-程序员宅基地

文章浏览阅读2k次。本文出自 “碧海笙箫” 博客,请务必保留此出处http://pyhcx.blog.51cto.com/713166/197073一、前提在Vista/Win7下,加强了对安全的管理,对注册表修改,系统目录的文件操作,都需要管理员权限才能完成(当然虚拟存储机制,表面上也相当于能操作)。所以,对于程序中有相关操作的,这时候,就要求我们的程序必须拥有管理员权限。通过mainfest文件,我们可以让程序总是需要管理员权限执行,但是,这将导致程序每次运行时,都需要弹出UAC框老骚扰用户,另外,有时候我们的程序只是在某_findwindow 没有权限

PCS7 入门指南 v9.0 SP3 v9.1 中文版 学习资料 (官方公开可用资料)_pcs7v9.1-程序员宅基地

文章浏览阅读1.8w次,点赞13次,收藏82次。链接:https://pan.baidu.com/s/1-p4h_QDL8BN04tnn3vSkOA提取码:nou3PCS7入门指南v9.0含APL(包含PDF和项目文件)官方地址:SIMATIC 过程控制系统 PCS 7 入门指南第1部分 (V9.0,含APL)https://support.industry.siemens.com/cs/document/109756196/simatic-%E8%BF%87%E7%A8%8B%E6%8E%A7%E5%88%B6%E7%B3%BB..._pcs7v9.1

c# 调用非托管代码_c# 声明kernel32 函数-程序员宅基地

文章浏览阅读956次,点赞3次,收藏5次。编程过程中,一般c#调用非托管的代码有两种方式:1.直接调用从DLL中导出的函数。2.调用COM对象上的接口方法。首先说明第1种方式,基本步骤如下:1.使用关键字static,extern声明需要导出的函数。2.把DllImport 属性附加到函数上。3.掌握常用的数据类型传递的对应关系。4.如果需要,为函数的参数和返回值指定自定义数据封送处理信息,这将重写.net framework默认的封送处理。简单举例如下:托管函数原型:DWORD GetShortPathName(LPCTST_c# 声明kernel32 函数

高频交易及化资策与区_hudson river trading-程序员宅基地

文章浏览阅读406次。转 高频交易及量化投资的策略与误区一、高频交易公司和量化投资公司的区别一般来说,高频交易公司和量化投资公司既有联系,又有区别。在美国,人们常说的高频交易公司一般都是自营交易公司,这些公司主要有Getco、Tower Research、Hudson River Trading、SIG、Virtu Financial、Jump Trading、RGM Advisor、Chopper Tradi..._hudson river trading

C语言文件操作相关的函数_c语言与文件处理有关的函数-程序员宅基地

文章浏览阅读865次。文件的打开和关闭文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件 的关系。ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。FILE * fopen ( const char * filename, const char * mode ); int fcl..._c语言与文件处理有关的函数

随便推点

MySQL安装与环境变量配置_mysql-installer-web-community-5.7.35.0.msi .net-程序员宅基地

文章浏览阅读299次。一、下载MySQL:mysql-installer-web-community-5.7.35.0.msi二、安装双击下载的msi安装文件,弹出安装界面根据指示进行下一步的安装。选择安装的产品,分别为:MySQL Server、MySQL Workbench,然后Next一路执行execute和next。直到设置root用户的密码一路next三、配置环境变量为了能在cmd中使用mysql,需要将安装路径的bin配置到环境变量path中。在 ._mysql-installer-web-community-5.7.35.0.msi .net

JSON(一):JSON的定义及常用的Java-JSON库_java和.net怎么去定义json的格式-程序员宅基地

文章浏览阅读254次。目录 一、JSON是什么?二、序列化和反序列化三、JSON两种数据结构和表示形式四、Java语言的常见JSON库五、JSON的应用场景资料一、JSON是什么?1、JSON:JavaScript Object Notation(JavaScript对象表示法)。2、JSON 是轻量级的文本数据交换格式。和 XML类似,比 XML更小、更快,更易解析。3、J..._java和.net怎么去定义json的格式

优化算法——拟牛顿法之BFGS算法-程序员宅基地

文章浏览阅读6.2w次,点赞25次,收藏188次。一、BFGS算法简介 BFGS算法是使用较多的一种拟牛顿方法,是由Broyden,Fletcher,Goldfarb,Shanno四个人分别提出的,故称为BFGS校正。 同DFP校正的推导公式一样,DFP校正见博文“优化算法——拟牛顿法之DFP算法”。对于拟牛顿方程:可以化简为:令,则可得:在B_bfgs算法

联想RD430服务器的Raid 5阵列+Esxi6.7部署_esxi6 raid m5015-程序员宅基地

文章浏览阅读3.9k次。一、主要解决的问题:(一)硬盘存储总容量提高+读写速率快1、原RD430服务器主板自带阵列卡仅支持Raid 0、Raid 1、Raid 10,主要特点:Raid 0速率快但是某一块硬盘物理故障后,所有数据都将丢失;Raid 1需要一半的硬盘做冗余,容量牺牲较多,速率比Raid 0降一倍。Raid 10容量牺牲一半,速率比Raid1稍快。2、独立阵列卡的Raid 5特点:Raid 5改进的特点:比如8个硬盘做成的阵列,总容量少1块硬盘的空间,某数据分布于不同的7个硬盘上,另1块硬盘进行数据校验,校验_esxi6 raid m5015

Linux安全应用2-程序员宅基地

文章浏览阅读59次。[root@localhost 桌面]# service NetworkManager stop[root@localhost 桌面]# chkconfig NetworkManager off[root@localhost 桌面]# setup[root@localhost 桌面]# vim /etc/udev/rules.d/70-persistent-net.rules..._linux本地安全2

深度篇——人脸识别(一)  ArcFace 论文 翻译_arcface论文-程序员宅基地

文章浏览阅读6.6k次,点赞23次,收藏120次。返回主目录返回 目标检测史 目录上一章:深度篇——目标检测史(八)CPTN 论文 翻译论文地址:《ArcFace: Additive Angular Margin Loss for Deep Face Recognition》源码地址:InsightFace: 2D and 3D Face Analysis Project本小节,ArcFace 论文 翻译,下一小节细说 ArcFace文本检测 代码一.ArcFace 论文 翻译1.概述..._arcface论文