图的简介
我们先回顾一下之前介绍的树的概念,在树的定义中,每个节点只能有一个父类,并且树中不能出现有环形。但是你可曾想过,当一棵树没有任何规则的时候,会发生什么吗?
现在,我们给图(graph)下一个定义:
图,是一种用节点和边来表示相互关系的数学模型。(A graph is a mathematical structure for representing relationships using nodes and edges)
其实,用句不是很严谨的话来说,图可以看成是没有任何限制的树(比如,可以有环状,可以有多种关系等等)。
下图是图但它们不是一棵树:
从图二中我们也可以看出,图没有固定的root。
图的基本结构
我们刚刚说了,图是由一系列的节点通过一系列的边连接在一起的,所以大体的图的数据结构可以为:
struct Graph{
set<Node *> nodes;
set<Edge*> edges;
};
而具体的节点和边我们可以这样表示:
struct Node{ //节点的数据结构
string value; //节点中的数值
vector<Edge *> edges;//连接该节点的边
};
struct Edge{//边的数据结构
Node * start;//边的起点
Node * end;//边的终点
};
我们经常在图的边上添加一些数值,成为边的权重,用weight表示,于是我们的边上的数据结构也可以这样定义为:
struct Edge{
Node * start;//边的起点
Node * end;//边的终点
double weight; //权
};
与图相关的一些概念
有向图与无向图
在离散数学课程中,我们学过图这个基本的数学结构还有它的一些概念,现在回顾一下:
下图中,每个表情可以看做是一个节点(也常称为顶点),而黑色的线将每个节点连接起来,称为边。
如图中的每一条边,如果有表明方向,有起点终点,这样的图我们称为有向图(Directed Graph即有方向的图)
相反如果图中的边没有方向性,那么我们就称这样的图为无向图(Undirected Graph即没有方向的图)
下图就是有向图跟无向图的区别
权重与权重图
权重:与给定边之间的相关的成本。
例如航空公司航班图表,按城市之间的里程加权:
先决条件图
顾名思义,前面的事物要建立在后面的基础上
与图相关的一些术语
下面看一副图
- 路径(path):从某个顶点到另一个顶点之间的路径,可以用经过的点或者经过的边来表示。例如从V到Z,所经过的路径可以表示为:
{b, h} 或者{V, X, Z} - 路径长度(path length):路径中包含的节点数或者边的数量
- 邻居(neighbor):通过一条边直接相连的两个节点,称为邻居,例如图中的V和X
- 环(cycle):路径的起点跟终点都是在同一个节点中的路径。例如(红色线条)和蓝色线条
路径:{b, g, f, c, a} 或者 {V, X, Y, W, U, V},还有 .{c, d, a} 或者{U, W, V, U}.
- 无环图:图中不包含任何的环状的图
- 循环(loop):连接自身顶点的边。许多图中是不允许包含有循环的
- 可达(reachable):如果存在一条路径,使得a能够到达b,就称a到b可达
- 连通(connect):如果图中每一个顶点都能相互可达,那么我们就称这图是连通的,称为连通图
- 完全图(complete):如果图中的 每个顶点都有一条边可以直达每个顶点,那么称这样的图为完全图。