第71課 圖的定義

1. 圖的定義編程

(1)定義:圖是由頂點集合(Vertex)及頂點間的關係集合(Edge)組成的一種數據結構Graph = (V, E); 其中:數據結構

  V={x|x∈某個數據對象}是頂點有窮非空集合spa

  E={(x,y)}x, y∈V}是頂點之間關係(邊)的有窮集合code

 

(2)比較線性表、樹和圖的不一樣對象

 

數據元素blog

的名稱ci

數據對象rem

(數據元素的集合)get

數據元素table

之間的關係

線性表

元素

無元素爲空表

線性關係

結點

無結點的爲空樹

層次關係

頂點(Vertex)

頂點集有窮非空

邊(邊集可爲空

2. 相關概念

 

(1)無向邊和無向圖

  ①無向邊:若頂點x和y之間的邊沒有方向,稱邊(x,y)爲無向邊(注意,用圓括號表示)。可見,(x,y)和(y,x)的意義相同,表示x和y之間有鏈接,x和y互爲鄰接點(adjacent)

  ②無向圖:任意兩個頂點之間的邊均爲無向邊的圖,稱爲無向圖(Undirected Graph)。如圖G1={V,{E}},其中頂點集V={A,B,C,D},邊集E={(A,B),(B,C),(C,D),(D,A),(A,C)}

2)有向邊和有向圖

  ①有向邊:若頂點x和y之間的邊有方向,稱邊<x,y>稱爲有向邊或弧(Arc)(注意:用尖括號表示)。可見,<x,y>和<y,x>意義不一樣,表示x鏈接到y。x爲弧尾(Tail),y爲弧頭(Head)

  ②有向圖:任意兩個頂點之間的邊均爲有向邊的圖,稱爲有向圖(Directed Graph)。對於有向圖G={V,{E}},其中頂點集V={A,B,C,D} ,邊集E={<A,D>,<B,A>,<B,C>,<C,A>}

3)頂點的度

  ①入度(InDegree):以v爲頭的邊的數目,記爲ID(v)。入度是針對有向圖的,如圖G2圖中A的入度爲2。

  ②出度(OutDegree):以v爲尾的邊的數目,記爲OD(v)。出度也是針對有向圖的,如圖G2中A的出度爲1。

  ③頂點的度:頂點v的度是和v相關聯的邊的數目,記爲TD(v)。適用於無向圖和有向圖,對於有向圖而言TD(v)=ID(v)+OD(v)

  ④頂點和邊的關係

頂點度數

TD(v) = ID(v) + OD(v)

頂點度數=入度+出度

邊數

E=[TD(v1)+TD(v2)+…+TD(vn)]/2

邊數=總度數/2

E=ID(v1)+ID(v2)+…+ID(vn)

邊數=總入度

E=OD(v1)+OD(v2)+…+OD(vn)

邊數=總出度

(4)權(weight)與圖的邊相關的數字,能夠表示頂點間的距離或耗費

 

3. 圖的操做

 

(1)常見的操做:①獲取/設置頂點的值;②獲取鄰接頂點;③獲取/設置邊的值。④刪除邊;⑤獲取頂點數/邊數;⑥獲取頂點的度數;⑦判斷是否爲無向圖,等等。

【編程實驗】圖的抽象類建立

#ifndef _GRAPH_H_
#define _GRAPH_H_

#include "Object.h"
#include "SharedPointer.h"
#include "Array.h"

namespace DTLib
{

//V爲頂點類型,E爲邊類型
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;

    //獲取頂點i的鄰接頂點
    virtual SharedPointer<Array<int> > getAdjacent(int i) = 0;

    //參數i爲起點、j爲終點、value爲邊(權值)
    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;

    //判斷是否可看作無向圖
    bool asUndirected()
    {
        bool ret =true;

        for(int i=0; i<vCount() && ret; i++){
            for(int j=0; j<vCount() && ret; j++){
                //判斷i和j互爲鄰接頂點且<i,j>和<j,i>邊的權值相等
                if(isAdjacent(i, j)){
                    ret = ret && isAdjacent(j, i) && (getEdge(i, j) == getEdge(j, i));
                }
            }
        }

        return ret;
    }

    //判斷圖中頂點i到頂點j是否鄰接
    virtual bool isAdjacent(int i, int j) = 0;

    virtual int vCount() = 0; //獲取頂點的數量
    virtual int eCount() = 0; //獲取邊的數量

    virtual int OD(int i) = 0; //獲取頂點i的出度
    virtual int ID(int i) = 0; //獲取頂點i的入度
    virtual int TD(int i) //獲取頂點i的度
    {
        return ID(i) + OD(i);
    }
};

}

#endif // _GRAPH_H_

4. 小結

(1)圖是頂點與邊的集合,是一種非線性的數據結構

(2)圖中頂點能夠與多個其它頂點產生鄰接關係

(3)邊的權值,用於表示頂點間的距離。

(4)圖在程序中表現爲特殊的數據類型

相關文章
相關標籤/搜索