图的定义

图是由顶点集合(Vertex)及顶点间的关系集合(Edge)组成的一种数据结构 : Graph = (V, E)

V = {X | X ∈ 某个数据对象} 是顶点的有穷非空集合
E = {(x, y) | x, y ∈ V} 是顶点之间关系的有穷集合

图的分类

思考:G1,G2,G3,G4 都是图吗?有什么异同?可以继续分类吗?

image.png

  • 无向边

    • 顶点 x 和 y 之间的边没有方向,则称该边为无向边
    • (x,y) 与 (y,x) 意义相同,表示 x 和 y 之间有连接
  • 无向图

    • 图中任意两个顶点之间的边均是无向边,则称该图为无限图

image.png

  • 有向边

    • 顶点 x 和 y 之间的边有方向,则称该边为有向边
    • <x,y> 表示从 x 连接到 y, x 称为尾, y 称为头
    • <y,x> 表示从 y 连接到 x, y 称为尾, x 称为头
  • 有向图

    • 途中任意两个顶点之间的边均是有向边,则称该图为有向图

image.png

顶点邻接(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(v1) + ID(v2) + ... + ID(vn)
  • Count(E) = OD(v1) + OD(v2) + ... + OD(vn)
  • Count(E) = [TD(v1) + TD(v2) + ... + TD(vn)] / 2

权(Weight)的定义

  • 与图的边相关的数据元素叫做权
  • 权常用来表示图中顶点间的距离或耗费

image.png

图的一些常用操作

  • 设置顶点的值
  • 获取顶点的值
  • 获取邻接顶点
  • 设置边的值
  • 删除边
  • 获取顶点数
  • 获取边数
  • 。。。

图的数据类型

图在程序中表现为一种特殊的数据类型
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);
    }
};

image.png

编程实验:图抽象类的创建

文件: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

小结

  • 图是顶点与边的集合,是一种非线性的数据结构
  • 图中顶点可以与多个其他顶点产生邻接关系
  • 图中的边有与之对应的权值,表示顶点间的距离
  • 图在程序中表现为特殊数据类型

以上内容整理于狄泰软件学院系列课程,请大家保护原创!


TianSong
734 声望138 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧