圖的理解:存儲結構與鄰接表的Java實現(xiàn)

存儲結構

要存儲一個圖,我們知道圖既有結點,又有邊,對于有權圖來說,每條邊上還帶有權值。常用的圖的存儲結構主要有以下二種:

  • 鄰接矩陣
  • 鄰接表

上一篇文章《圖的理解:存儲結構與鄰接矩陣的Java實現(xiàn)》用的是鄰接矩陣的形式實現(xiàn)的,這次用鄰接表來存儲

30adcbef76094b36d054d85ba0cc7cd98c109d46.jpg

就如上圖所示,表頭節(jié)點表示源節(jié)點,后面跟的就是他能到達的節(jié)點,比如A,他能到達1,2,3節(jié)點,而有向圖和無向圖最大的區(qū)別,就是方向,無向圖A->B,也一定有B->A,在有向圖中就不一定,這次介紹帶權重的有向圖的鄰接表表示。

首先要表示圖,首先要定義圖的邊
//帶權重的有向圖
public class DirectedEdge {
    private int v; //邊的起點
    private int w; //邊的終點

    private double weight;//邊的權重

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

    public int from(){
        return v;
    }

    public int to(){
        return w;
    }

    public double weight(){
        return weight;
    }

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

這里跟上圖表示的有點不一樣,我把兩個頂點都保留下來啦,如果不需要權重,去掉weight就行

定義完圖的邊,就需要定義圖
public class EdgeWeightDigraph {
    public int v;//頂點的個數(shù)
    public int e; //邊的個數(shù)

    public ArrayList<DirectedEdge> [] adj; //鄰接表

    public EdgeWeightDigraph(int v){
        this.v=v;
        this.e=e;
        adj=new ArrayList[v];
        for(int i=0;i<v;i++){
            adj[i]=new ArrayList<DirectedEdge>();
        }
    }

    /**
     * 添加邊
     * @param e
     */
    public void addEdge(DirectedEdge e){
        adj[e.from()].add(e);
        this.e++;
    }

    public void printEdge(){
        for(int i=0;i<v;i++){
            for(DirectedEdge e:adj[i]){
                System.out.println(e+" ");
            }
        }

    }
   public static void main(String[] args){
         EdgeWeightDigraph graph=new EdgeWeightDigraph(5);

          DirectedEdge e=new DirectedEdge(0,1,1);
          DirectedEdge e1=new DirectedEdge(0,2,1);
          DirectedEdge e2=new DirectedEdge(1,2,1);
          DirectedEdge e3=new DirectedEdge(2,3,1);
          DirectedEdge e4=new DirectedEdge(3,4,1);

        graph.addEdge(e);
        graph.addEdge(e1);
        graph.addEdge(e2);
        graph.addEdge(e3);
        graph.addEdge(e4);

        graph.printEdge();

    }
}

這里我用list集合來表示鄰接表,添加邊時,e.from表示源邊,在它的集合里保存邊即可

控制臺輸出結果如下圖所示:
result.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容