圖論之有權圖「帶權圖的表示」

yangkuang發表於2021-05-25

一、介紹

帶權圖(Weighted Graph):帶權圖就是指圖中的每一條邊都有對應的一個或一組值,通常情況下這個值的是數值。
如:在交通運輸網中,邊上的權值可能表示的是路程,也可能表示
的是運輸費用(顯然二者都是數字)。不過,邊上的權值也有可能
是其它東西,比如說是一個字串,甚至是一個更加複雜的資料包,
裡面集合了更多的資料。

圖論之有權圖「帶權圖的表示」

二、表示方法

  1. 鄰接表
    在無權圖中鄰接表只存放了相應頂點,而現在帶權圖既需要存放頂點又需要存放權值,所以在帶權圖中的需要一個Edge的類來表示有權圖的頂點和權值,表示方法如下:
    圖論之有權圖「帶權圖的表示」
    這裡再將權值的型別寫成指標型別

圖論之有權圖「帶權圖的表示」

  1. 鄰接矩陣
    在帶權中不再使用bool值,但是這裡為了統一介面,統一將鄰接矩陣的表示寫成一個Edge類
    圖論之有權圖「帶權圖的表示」
    這裡再將權值的型別寫成指標型別

圖論之有權圖「帶權圖的表示」

三、帶權圖的實現

  1. 首先需要編寫一個Edge的類,用來表示帶全圖

    #include <iostream>
    #include <cassert>
    using namespace std;
    // 邊
    //使用模板型別Weight
    template<typename Weight>
    class Edge{
    private:
     //一條邊對應兩個端點
     int a,b; // 邊的兩個端點
    Weight weight; // 邊的權值
    public:
     // 建構函式
    Edge(int a, int b, Weight weight){
         this->a = a;
         this->b = b;
         this->weight = weight;
    }
     // 空的建構函式, 所有的成員變數都取預設值
    Edge(){}
    //解構函式
    ~Edge(){}

    成員函式

    int v(){
       return a;    // 返回第一個頂點
     }     
    int w(){
       return b;    // 返回第二個頂點
    }      
    Weight wt(){      // 返回權值
       return weight;
     }   
    
     // 給定一個頂點, 返回另一個頂點
     //other(int x)在圖的演算法中常用
    int other(int x){
       assert( x == a || x == b );
       return x == a ? b : a;
    }

    在圖中,我們會經常對物件進行運算子操作,所以在這裡需要使用運算子的過載,如下:

    // 輸出邊的資訊
    friend ostream& operator<<(ostream &os, const Edge &e){
           os<<e.a<<"-"<<e.b<<": "<<e.weight;
           return os;
    }
    // 邊的大小比較, 是對邊的權值的大小比較
    bool operator<(Edge<Weight>& e){
           return weight < e.wt();
    }
     bool operator<=(Edge<Weight>& e){
           return weight <= e.wt();
    }
     bool operator>(Edge<Weight>& e){
           return weight > e.wt();
    }
     bool operator>=(Edge<Weight>& e){
           return weight >= e.wt();
    }
     bool operator==(Edge<Weight>& e){
           return weight == e.wt();
     }
    };

    2.稀疏圖(鄰接表)的實現

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章