1、基本介绍
2、应用实例
package graph;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class GraphDemo {
public static void main(String[] args) {
GraphByMatrix graphByMatrix = createGraphByMatrix();
GraphByTable graphByTable = createGraphByTable();
System.out.println("邻接矩阵:");
graphByMatrix.showGraph();
System.out.println("邻接表:");
graphByTable.showGraph();
}
public static GraphByTable createGraphByTable() {
String[] vertexs = {"0","1","2","3","4","5"};
GraphByTable graph = new GraphByTable(vertexs.length);
graph.insertVertex(vertexs); // 插入节点
graph.insertEdge(0, 1, "1");
graph.insertEdge(0, 2, "2");
graph.insertEdge(0, 3, "3");
graph.insertEdge(0, 4, "4");
graph.insertEdge(1, 0, "0");
graph.insertEdge(1, 4, "4");
graph.insertEdge(2, 0, "0");
graph.insertEdge(2, 4, "4");
graph.insertEdge(2, 5, "5");
graph.insertEdge(3, 0, "0");
graph.insertEdge(3, 5, "5");
graph.insertEdge(4, 0, "0");
graph.insertEdge(4, 1, "1");
graph.insertEdge(4, 2, "2");
graph.insertEdge(4, 5, "5");
graph.insertEdge(5, 2, "2");
graph.insertEdge(5, 3, "3");
graph.insertEdge(5, 4, "4");
return graph;
}
public static GraphByMatrix createGraphByMatrix() {
String[] vertexs = {"0","1","2","3","4","5"};
GraphByMatrix graph = new GraphByMatrix(vertexs.length);
for (String vertex : vertexs) {
graph.insertVertex(vertex);
}
graph.insertEdge(0, 1, 1);
graph.insertEdge(0, 2, 1);
graph.insertEdge(0, 3, 1);
graph.insertEdge(0, 4, 1);
graph.insertEdge(1, 0, 1);
graph.insertEdge(1, 4, 1);
graph.insertEdge(2, 0, 1);
graph.insertEdge(2, 4, 1);
graph.insertEdge(2, 5, 1);
graph.insertEdge(3, 0, 1);
graph.insertEdge(3, 5, 1);
graph.insertEdge(4, 0, 1);
graph.insertEdge(4, 1, 1);
graph.insertEdge(4, 2, 1);
graph.insertEdge(4, 5, 1);
graph.insertEdge(5, 2, 1);
graph.insertEdge(5, 3, 1);
graph.insertEdge(5, 4, 1);
return graph;
}
}
class Node {
public int index; // 顶点下标
public String data; // 顶点自身数据
public Node next;
public Node(int index, String data) {
this.index = index;
this.data = data;
}
}
class GraphByTable {
public Node[] adjacenTable;
public int numOfVertex; // 顶点的个数
public int numOfEdges; // 边的条数
public GraphByTable(int numOfVertex) {
adjacenTable = new Node[numOfVertex];
this.numOfVertex = numOfVertex;
this.numOfEdges = 0;
}
public void insertVertex(String[] vertexs) {
for (int i = 0; i < vertexs.length; i++) {
adjacenTable[i] = new Node(i,vertexs[i]);
}
}
/*
v1:第一个顶点的的数组下标
v2:另一个顶点的数组下标
data:权值
*/
public void insertEdge(int v1, int v2, String data) {
Node newNode = new Node(v2,data);
Node temp = adjacenTable[v1].next;
if (temp == null) {
adjacenTable[v1].next = newNode;
this.numOfEdges++;
return;
}
while(temp.next != null) {
temp = temp.next;
}
temp.next = newNode;
this.numOfEdges++;
}
// 打印图
public void showGraph() {
for (int i = 0; i < adjacenTable.length; i++) {
System.out.print(i + " => ");
Node temp = adjacenTable[i].next;
while(temp != null) {
System.out.print(temp.index + " ");
temp = temp.next;
}
System.out.println();
}
}
//
// 返回该邻接矩阵的顶点个数
public int getNumOfVertex() { return this.numOfVertex; }
// 返回该邻接矩阵的边的条数
public int getNumOfEdges() { return (this.numOfEdges >> 1); }
}
class GraphByMatrix {
public List<String> vertexLists; // 存储顶点的集合
public int[][] edges; // 存储边的二维数组
public int numOfVertex; // 顶点的个数
public int numOfEdges; // 边的条数
public GraphByMatrix (int numOfVertex) {
vertexLists = new ArrayList<>(numOfVertex);
edges = new int[numOfVertex][numOfVertex];
this.numOfVertex = numOfVertex;
this.numOfEdges = 0;
}
// 插入顶点
public void insertVertex(String vertex) {
vertexLists.add(vertex);
}
// 插入边
/*
v1:第一个顶点的下标
v2:第二个顶点的下标
w:权值,默认为1,表示这两个顶点有边
*/
public void insertEdge(int v1, int v2, int w) {
edges[v1][v2] = w;
edges[v2][v1] = w;
this.numOfEdges++;
}
// 打印图
public void showGraph() {
for (int[] temp : edges) {
System.out.println(Arrays.toString(temp));
}
System.out.println();
}
// 返回该邻接矩阵的顶点个数
public int getNumOfVertex() {
return this.numOfVertex;
}
// 返回该邻接矩阵的边的条数
public int getNumOfEdges() {
return (this.numOfEdges >> 1);
}
}