第七章(5).非连通图的生成森林

这篇博客介绍了如何处理非连通图的生成森林问题,通过深度优先搜索策略,遍历无向图的每个连通分量,构建生成树,并形成生成森林。文章提供了C语言实现的算法,包括邻接多重表存储、遍历和输出无向图的函数,以及深度优先搜索森林和树的代码示例。
摘要由CSDN通过智能技术生成

//对于非连通图,每个连通分量中的顶点集,和遍历时走过的边一起构成若干颗生成树,这些连通分量的生成树组成非连通图的生成森林。

//在对无向图进行遍历时,对于连通图,仅从图中任一点出发,进行深度优先搜索或广度搜索,便可以访问到图中所有观点。
//      对于非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量的顶点集。
#include < stdio.h >
#include < stdlib.h >
#include < string.h >

#define TRUE 1  
#define FALSE 0    
#define OK 1
#define ERROR 0
#define OVERFLOW -2     //Include by "math.h"!

typedef int Status ;

#ifndef Boolean
#define Boolean unsigned char
#endif

//-------------------------无向图的邻接多重表存储表示-------------------------------//

#define MAX_VERTEX_NUM 20    //最大顶点个数(vertex顶点)
#define MAX_NAME  5    //关于顶点信息的字符串长度
#define MAX_INFO     20    //边的信息字符树

Boolean visite[ MAX_VERTEX_NUM ] ; 

typedef enum{ unvisited , visited } VisitIf ;
typedef char InfoType ;    //如果为字符信息,则可以用char;如果为权值,则可以用int.
typedef char VertexType[ MAX_NAME ] ;//VertexType可以根据实际情况灵活设定类型!int,float,char…

typedef struct EBox {     //边结点
 VisitIf   mark ;    //访问标记
 int    ivex , jvex ;  //该边依附的两个顶点的位置
 struct EBox  *ilink , *jlink ; //分别指向依附这两个顶点的下一条边
 InfoType  *info ;    //该边信息指针
} EBox ;

typedef struct VexBox {     //顶点结点
 VertexType  data ;
 EBox   *firstedge ;  //指向第一条依附该顶点的边
} VexBox ;

typedef struct {
 VexBox   adjmulist[ MAX_VERTEX_NUM ] ;
 int    vexnum , edgenum ; //无向图的当前顶点数和边数
} AMLGraph ;

Status LocateVex( AMLGraph G , VertexType u ) ;
Status CreateUDG( AMLGraph *G ) ;
VertexType *GetVex( AMLGraph G , int n ) ;
Status FirstAdjVex( AMLGraph G , VertexType u ) ;
Status NextAdjVex( AMLGraph G , VertexType u , VertexType w ) ;
Status MarkUnvisited( AMLGraph *G ) ;
Status Output( AMLGraph G ) ;

//------------------------Link Tree--------------------------//

typedef VertexType TElemType ;  //为一个字符数组
typedef struct CSNode{
 TElemType data ;
 struct CSNode *firstchild , *nextsibling ;
} CSNode , *CSTree ;

Status PreOrderTraverse( CSTree T , void( *v )( char *p ) ) ;
void visit( char *p ) ;

//-----------------------------------------------------------------------------------//

void DFSForest( AMLGraph G ,  CSTree

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值