networkx 有向图强连通_图的创建和遍历

本文介绍了图的定义,包括无向图和有向图的概念,以及连通性的概念。重点讲解了邻接矩阵和邻接表两种图的存储结构,并提供了邻接表实现无向图的C++代码,包括创建图的函数和深度优先遍历(BFS)、广度优先遍历(BFS)的实现。最后,给出了一个具体图的实例进行测试。
摘要由CSDN通过智能技术生成

目录

catalog.png

图的定义

数据结构中,图由顶点和边构成如下:

图1

上图中数字代表顶点(Vertex),连接顶点的是边(Edge),通过边表示顶点之间的逻辑关系。

无向图

定义:若表示顶点关系的边没有方向(无向边),则此图为无向图,如图1。顶点Vi到Vj之间的边表示为(Vi,Vj),代表Vi,Vj邻接。

顶点的度:

与某个顶点有关的边的数量,代表此顶点的度。如图1,顶点1的度为2。

完全无向图

无向图中,如果每个顶点都存在到其他顶点的边,则此图为完全无向图:

UnGraph.png

​ 完全无向图有n(n-1)/2条边,n为顶点数。

有向图

定义

当顶点之间的边有方向时,图为有向图。如下:

directed.png

​ 并使用有序对来表示顶点Vi,Vj之间的边,称为弧。Vi称为弧尾,Vj为弧头。例如,上图顶点A、D之间的边表示为:表明方向A->D

出度、入度

以顶点Vi为弧尾的弧数量,表示Vi的出度,以顶点Vi为弧头的数量,表示Vi的入度。

完全有向图

任意顶点存在互为相反方向的边,称为完全有向图

图中的边或弧,存在对应的数字,这样的图称为网,边或弧对应的数字称为权。

network.png

上图的权值表示距离。

连通性

连通图

在无向图G中,存在从Vi到Vj的路径,则称Vi和Vj是连通的。如果G中任意两个顶点都是连通的,则称G为连通图。

connected.png

无向图中的极大连通子图称为连通分量,连通分量条件:

子图

子图要是连通的

连通子图含有极大顶点数

强连通图

在有向图G中,对于任意Vi,Vj,存在Vi->Vj 和Vj->Vi的路径,则称G是强连通图。

有向图的极大强连通子图称为强连通分量

图的存储结构

邻接矩阵

使用两个数组来表示图。

一个一维数组Vertex表示顶点

一个二维数组edge表示边。

edge[i][j]= W //表示权值

0 //i=j

Infinty // 表示边(i,j)不存在

Adjcency Matrix.png

邻接表

邻接表与邻接矩阵相比,使用链表代替二维数组。对于边数比顶点数少的情况,邻接矩阵存在着巨大的浪费,而使用链式结构可以很好的避免浪费。

使用一个一维数组表示顶点

使用单链表来表示每个顶点的邻接顶点

Adjcency List.png

其他结构

十字链表、多重邻接表

十字链表作用于有向图、多重邻接表作用于无向图,都是邻接表的进阶版本,不做详细介绍

邻接表代码实现

边节点结构:

typedef struct EdgeNode{ //边节点

int adjVertex;

Tweight weight; //权重

EdgeNode* next;c++

}EdgeNode;

顶点节点结构:

typedef struct VertexNode { //顶点节点

Tvertex vertex; //顶点值

EdgeNode* firstEdge; //指向的边

}VertexNode;

类声明:

template

class UndirectedGraph //邻接表实现无向图

{

private:

typedef struct EdgeNode{ //边节点

int adjVertex;

Tweight weight; //权重

EdgeNode* next;

}EdgeNode;

typedef struct VertexNode { //顶点节点

Tvertex vertex; //顶点值

EdgeNode* firstEdge; //指向的边

}VertexNode;

std::vector graph; //保存顶点的数组

int verxNums; //顶点数量

int edgeNums; //边数量

public:

UndirectedGraph(int vn = 0,int en = 0):verxNums(vn),edgeNums(en){}

void CreateGraph();

void

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值