图的定义
图是由顶点集合(Vertex)及顶点间的关系集合(Edge)组成的一种数据结构 : Graph = (V, E)
V = {X | X ∈ 某个数据对象} 是顶点的有穷非空集合
E = {(x, y) | x, y ∈ V} 是顶点之间关系的有穷集合
图的分类
思考:G1,G2,G3,G4 都是图吗?有什么异同?可以继续分类吗?
无向边
- 顶点 x 和 y 之间的边没有方向,则称该边为无向边
- (x,y) 与 (y,x) 意义相同,表示 x 和 y 之间有连接
无向图
- 图中任意两个顶点之间的边均是无向边,则称该图为无限图
有向边
- 顶点 x 和 y 之间的边有方向,则称该边为有向边
- <x,y> 表示从 x 连接到 y, x 称为尾, y 称为头
- <y,x> 表示从 y 连接到 x, y 称为尾, x 称为头
有向图
- 途中任意两个顶点之间的边均是有向边,则称该图为有向图
顶点邻接(Adjacent)的定义
无向图
- 如果 (x, y) ∈ E, 则称顶点 x 和 y 互为邻接
有向图
- 如果 <x, y> ∈ E, 则称顶点 x 邻接到顶点 y
度(Degree)的定义
顶点 v 的度是 v 相关联的边的数目,记为 TD(v)
- 入度: 以 v 为头的边的数目,记为 ID(v)
- 出读: 以 v 为尾的边的数目,记为 OD(v)
推论
- TD(v) = ID(v) + OD(v)
- Count(E) = ID(v
1
) + ID(v2
) + ... + ID(vn
)- Count(E) = OD(v
1
) + OD(v2
) + ... + OD(vn
)- Count(E) = [TD(v
1
) + TD(v2
) + ... + TD(vn
)] / 2
权(Weight)的定义
- 与图的边相关的数据元素叫做权
- 权常用来表示图中顶点间的距离或耗费
图的一些常用操作
- 设置顶点的值
- 获取顶点的值
- 获取邻接顶点
- 设置边的值
- 删除边
- 获取顶点数
- 获取边数
- 。。。
图的数据类型
图在程序中表现为一种特殊的数据类型
template <typename V, typename E>
class Graph : public Object
{
public:
virtual V getVertex(int i) = 0;
virtual bool getVertex(int i, V &value) = 0;
virtual bool setVertex(int i, const V &value) = 0;
virtual SharedPointer<Array<int>> getAdjacent(int i) = 0;
virtual E getEdge(int i, int j) = 0;
virtual bool getEdge(int i, int j, E &value) = 0;
virtual bool setEdge(int i, int j, const E &value) = 0;
virtual bool removeEdge(int i, int j) = 0;
virtual int vCount() = 0;
virtual int eCount() = 0;
virtual int OD(int i) = 0;
virtual int ID(int i) = 0;
virtual int TD(int i)
{
return OD(i) + ID(i);
}
};
编程实验:图抽象类的创建
文件:Graph.h
#ifndef GRAPH_H
#define GRAPH_H
#include "Object.h"
#include "SharedPointer.h"
#include "Array.h"
namespace DTLib
{
template <typename V, typename E>
class Graph : public Object
{
public:
virtual V getVertex(int i) = 0;
virtual bool getVertex(int i, V &value) = 0;
virtual bool setVertex(int i, const V &value) = 0;
virtual SharedPointer<Array<int>> getAdjacent(int i) = 0;
virtual E getEdge(int i, int j) = 0;
virtual bool getEdge(int i, int j, E &value) = 0;
virtual bool setEdge(int i, int j, const E &value) = 0;
virtual bool removeEdge(int i, int j) = 0;
virtual int vCount() = 0;
virtual int eCount() = 0;
virtual int OD(int i) = 0;
virtual int ID(int i) = 0;
virtual int TD(int i)
{
OD(i) + ID(i);
}
};
}
#endif // GRAPH_H
小结
- 图是顶点与边的集合,是一种非线性的数据结构
- 图中顶点可以与多个其他顶点产生邻接关系
- 图中的边有与之对应的权值,表示顶点间的距离
- 图在程序中表现为特殊数据类型
以上内容整理于狄泰软件学院系列课程,请大家保护原创!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。