圖須要存儲的信息有如下這些java
一、頂點信息數組
二、邊或弧的信息,若是有權,也須要表示出來it
三、頂點個數、邊(弧)的個數class
鄰接矩陣及其實現效率
頂點數據存儲:List
一維數組遍歷
邊(弧)信息存儲im
鄰接矩陣鏈表
圖中n個頂點之間相鄰關係的n階矩陣(即二維數組a[n][n])數據
下面舉例說明
無向圖鄰接矩陣,中間斜着的一條線上的0,表明的意義是同一頂點,其他部分,1表明2頂點之間有邊,0表明無邊。
無向網鄰接矩陣,中間斜着的一條線上的0,表明的意義是同一頂點,其他部分,用一個大於全部邊的權值的值來表示沒有沒有邊,具體的值表示邊上的權值。
有向圖鄰接矩陣,有幾個特色,不必定對稱,行方向上的非0元素的個數意味着該頂點的出度,列方向上的非0元素的個數意味着該頂點的入度。
鄰接矩陣法的優勢:
容易實現圖的操做,如:求某頂點的度、判斷頂點之間是否有邊(弧)、找頂點的鄰接點
鄰接矩陣法的缺點:
n個頂點,須要n*n個單元存儲邊(弧),空間效率爲O(n2),
對於稀疏圖的話,尤爲浪費空間
圖的java定義,圖當中頂點類型爲int,而後有4個頂點,6條邊(弧),該定義既能夠表示有向圖,也能夠表示無向圖,同時也能夠表示有整形權的網。
public class Graph {
int vn;
int en;
int[] vex;
int[][] arc;
public static void main(String[] args){
Graph graph = new Graph();
graph.vn = 10;
graph.en = 20;
graph.vex = new int[graph.vn];
graph.arc = new int[graph.vn][graph.vn];
}
}
建圖運算,咱們設置了1,2,3,4一共四個頂點,而後,在全部不一樣頂點之間畫上了邊,其實這裏咱們就是作了一個徹底圖(至因而有向仍是無向,全看你怎麼理解和使用了)
for (int i = 1; i <= 4; i ++){
graph.vex[i - 1] = i;
}
for (int i = 1; i <= 4; i ++){
for (int j = 1; j <= 4; j ++) {
graph.arc[i - 1][j - 1] = i == j ? 0 : 1;
}
}
鄰接表及其實現
是順序與連接相結合的圖的存儲方式
全部頂點組成一個數組,爲每一個頂點創建一個單向鏈表
下面仍是舉例說明
無向圖鄰接表
無向網鄰接表,增長了每一條邊的權值信息
有向圖鄰接表
鄰接表的優勢:
空間效率高;容易尋找頂點的鄰接點
鄰接表的缺點:
對於有向圖而言,查詢頂點的出度很容易,可是要查詢入度,就須要遍歷整個表。
鄰接表的java定義,這裏咱們跟前面的概念部分有所不一樣,不過問題不大,須要注意的是,若是是網的存儲的話,這樣的作法就不行了,可能須要針對邊,再作一個類。
public class GraphWithLink {
Vex[] vex;
List<Vex> arc = new LinkedList<Vex>();
int vn;
int en;
}
public class Vex {
int i;
}
建圖運算,咱們仍是建一個4個頂點的徹底圖
public static void main(String[] args){
GraphWithLink graph = new GraphWithLink();
graph.vn = 4;
graph.en = 6;
graph.vex = new Vex[graph.vn];
for (int i = 1; i <= 4; i ++){
Vex vex = new Vex();
vex.i = i;
graph.vex[i - 1] = vex;
}
for (int i = 1; i <= 4; i++) { graph.arc.add(graph.vex[i - 1]); for (int j = 1; j <= 4; j++) { if (i != j){ graph.arc.add(graph.vex[j - 1]); } } } }