目录
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