Java資料結構(十七)—— 圖
阿新 • • 發佈:2020-12-08
圖
圖的基本介紹
為什麼要有圖?
-
線性表侷限於一個直接前去和一個直接後繼的關係
-
樹也只能有一個直接前去也就是父節點
-
當我們表示 多對多的關係是=時,就用到了圖
圖的舉例說明
-
圖是一種資料結構,其中節點可以具有零個或多個相鄰元素。
-
兩節點之間的連線稱為邊,節點稱為頂點
如圖:
圖的常用概念
-
頂點:節點
-
邊:頂點間的連線
-
路徑:節點A到節點B的通路
-
無向圖:頂點之間的連線沒有方向
-
有向圖:頂點之間的連線有方向
-
帶權圖:邊帶有權值的圖
圖的表示方式
-
鄰接矩陣(二維陣列表示)
-
鄰接矩陣:是表示圖形中頂點之間相鄰關係的矩陣,對於 n個頂點的圖而言,矩陣是row和col表示的是1……n個點
-
0表示不直接連通,1表示直接連通
-
-
鄰接表(連結串列表示)
-
鄰接矩陣需要為每隔頂點都分配n個邊的空間,其實有很多邊都是不存在的,會造成空間損失
-
鄰接表只關心存在的邊
-
鄰接表由陣列 + 連結串列組成
-
二維陣列表示各個節點標號,連結串列儲存與之連通的節點標號
-
圖的建立
要求
-
程式碼實現如下圖
思路分析
-
儲存頂點 String 使用 ArrayList
-
儲存鄰接矩陣矩陣,使用二維陣列
程式碼實現
package com.why.graph;
import java.util.ArrayList;
import java.util.Arrays;
/**
* @Description TODO 圖
* @Author why
* @Date 2020/12/7 17:42
* Version 1.0
**/
public class Graph {
private ArrayList<String> vertexList;//儲存頂點
private int[][] edges;//儲存圖的鄰接矩陣
private int numOfEdges;//邊的個數
public static void main(String[] args) {
//測試建立圖
int n = 5;//節點個數
String[] Vertexs = {"A","B","C","D","E"};
//建立圖
Graph graph = new Graph(n);
//迴圈新增節點
for (String value : Vertexs
) {
graph.insertVertex(value);
}
//新增邊
//A-B,A-C,B-C,B-D,B-E互相連線
graph.insertEdge(0,1,1);
graph.insertEdge(0,2,1);
graph.insertEdge(1,2,1);
graph.insertEdge(1,3,1);
graph.insertEdge(1,4,1);
//列印
graph.showGraph();
}
/**
* 構造器
* @param n 頂點個數
*/
public Graph(int n) {
//初始化矩陣和頂點列表
edges = new int[n][n];
vertexList = new ArrayList<>(n);
numOfEdges = 0;
}
/**
* 插入節點
* @param vertex
*/
public void insertVertex(String vertex){
vertexList.add(vertex);
}
/**
* 新增邊
* @param v1 節點下標
* @param v2 節點下標
* @param weight 權值
*/
public void insertEdge(int v1,int v2,int weight){
edges[v1][v2] = weight;
edges[v2][v1] = weight;
numOfEdges++;
}