日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java邻接图_Java数据结构 - 图(邻接表存储)

發(fā)布時間:2024/10/14 java 77 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java邻接图_Java数据结构 - 图(邻接表存储) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鄰接表

相比鄰接矩陣,鄰接表要更加節(jié)省空間。

鄰接表存儲

本文將介紹鄰接表存儲有向帶權(quán)圖。圖的例子如下。

介紹一下鄰接表

上面的圖對應(yīng)的鄰接表如下圖所示:

鄰接表

前面的數(shù)組存儲的是所有的頂點,每一個頂點后面連接的塊代表前面頂點所指向的頂點和路線的權(quán)值。如果該點還指向其他頂點,則繼續(xù)在塊后面添加。例如A指向了B權(quán)值是4,那么A后面就加上一塊,之后發(fā)現(xiàn)A還指向D權(quán)值是5,那么就在塊尾繼續(xù)添加一塊。其實也就是數(shù)組+鏈表的結(jié)構(gòu)。

如何存儲呢?

根據(jù)鄰接表的結(jié)構(gòu)和圖,我們不難發(fā)現(xiàn),圖其實是由頂點和弧組成的。所以我們就抽象出兩種類,一個是Vertex頂點類,一個是Edge弧類。

Vertex類,包括頂點的名字,和從頂點出發(fā)的弧。代表數(shù)組

private class Vertex{

private String name; //頂點名稱

private Edge next; //從該定點出發(fā)的弧

}

Edge類,包括被指向頂點的名稱,弧的權(quán)值,下一個弧。

private class Edge{

private String name; //被指向的頂點

private int weight; //弧的權(quán)值

private Edge next; //被指向的下一段弧

}

上圖中的數(shù)組中的元素就是Vertex,后面接上塊就是Edge。

完整代碼如下

代碼使用HashMap集合存儲頂點。對于輸入的弧,頂點如果不存在則添加新的頂點。讀者可以自己進行查看。

/**

* 有向帶權(quán)圖

* Created by ShouJingGuo on 2018/3/27.

*/

public class Graph {

Map vertexsMap; //存儲所有的頂點

private class Vertex{

private String name; //頂點名稱

private Edge next; //下一段弧

Vertex(String name, Edge next){

this.name = name;

this.next = next;

}

}

private class Edge{

private String name; //被指向頂點名稱

private int weight; //弧的權(quán)值

private Edge next; //下一段弧

Edge(String name, int weight, Edge next){

this.name = name;

this.weight = weight;

this.next = next;

}

}

Graph(){

this.vertexsMap = new HashMap<>();

}

public void insertVertex(String vertexName){ //添加頂點

Vertex vertex = new Vertex(vertexName, null);

vertexsMap.put(vertexName, vertex);

}

public void insertEdge(String begin, String end, int weight){ //添加弧

Vertex beginVertex = vertexsMap.get(begin);

if(beginVertex == null){

beginVertex = new Vertex(begin, null);

vertexsMap.put(begin, beginVertex);

}

Edge edge = new Edge(end, weight, null);

if(beginVertex.next == null){

beginVertex.next = edge;

}else{

Edge lastEdge = beginVertex.next;

while(lastEdge.next != null){

lastEdge = lastEdge.next;

}

lastEdge.next = edge;

}

}

public void print(){ //打印圖

Set> set = vertexsMap.entrySet();

Iterator> iterator = set.iterator();

while(iterator.hasNext()){

Map.Entry entry = iterator.next();

Vertex vertex = entry.getValue();

Edge edge = vertex.next;

while(edge != null){

System.out.println(vertex.name + " 指向 " + edge.name + " 權(quán)值為:" + edge.weight);

edge = edge.next;

}

}

}

public static void main(String[] args) {

Graph graph = new Graph();

graph.insertVertex("A");

graph.insertVertex("B");

graph.insertVertex("C");

graph.insertVertex("D");

graph.insertVertex("E");

graph.insertVertex("F");

graph.insertEdge("C", "A", 1);

graph.insertEdge("F", "C", 2);

graph.insertEdge("A", "B", 4);

graph.insertEdge("E", "B", 2);

graph.insertEdge("A", "D", 5);

graph.insertEdge("D", "F", 4);

graph.insertEdge("D", "E", 3);

graph.print();

}

}

總結(jié)

以上是生活随笔為你收集整理的java邻接图_Java数据结构 - 图(邻接表存储)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。