數據結構:加權圖的API

加權圖是一種爲每條邊關聯一個權值或者成本的圖模型

在之前的例子中,鄰接表取得了很好的效果。要表示加權圖,我們只需要擴展一下之前的代碼即可。之前我們直接在鄰接表中存放頂點信息,現在我們改爲存放Edge對象

package MST;

public class Edge implements Comparable<Edge>{

    private final int v;//己方頂點
    private final int w;//對方頂點
    private final double weight;//權重

    public Edge(int v, int w, double weight) {
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

    public double weight(){
        return weight;
    }

    //返回己方頂點
    public int thisSide(){
        return v;
    }

    //返回對方頂點
    public int thatSide(int vertex){
        if(vertex == v)
            return w;
        else if(vertex == w)
            return v;
        else
            throw new RuntimeException( "Inconsistent edge");
    }

    public int compareTo(Edge that){
        if(this.weight() < that.weight())
            return -1;
        else if(this.weight() > that.weight())
            return 1;
        else
            return 0;
    }

    public String toString(){
        return String.format("%d-%d %.2f", v,w,weight);
    }

}

下面是無向加權圖的API,跟無向圖的API十分相似。

package MST;

import list.MyArrayList;

public class EdgeWeightGraph {

    private final int V;
    private int E;
    private MyArrayList<Edge>[] adj;//原本是private MyArrayList<Integer>[] adj;


    public EdgeWeightGraph(int V) {
        this.V = V;
        this.E = 0;
        adj = (MyArrayList<Edge>[]) new MyArrayList[this.V];
        for(int i=0;i<this.V;i++)
            adj[i] = new MyArrayList<Edge>();
    }

    public int V(){
        return this.V;
    }

    public int E(){
        return this.E;
    }

    public void addEdge(Edge e){
        adj[e.thisSide()].add(e);
        adj[e.thatSide(e.thisSide())].add(e);
        E++;
    }

    public Iterable<Edge> adj(int v){
        return adj[v];
    }

    /**
     * 返回所有的邊
     * @return
     */
    public Iterable<Edge> edges(){
        MyArrayList<Edge> list = new MyArrayList<>();
        for(int v=0; v<this.V; v++)
            for(Edge e:adj[v]){
                if(e.thatSide(v) > v)
                    list.add(e);
            }
        return list;
    }

}

加權有向圖的API也可以簡單得到,我就不給出代碼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章