六、图
1. 图基本介绍
当我们需要表示多对多的关系时,这里我们就用到了图。
1.1 图的举例说明
图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。
1.2 图的常用概念
1)顶点(vertex)
2)边(edge)
3)路径
4)无向图
5)有向图
6)带权图
1.3 图的表示方式
1.3.1 邻接矩阵
邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1....n个点。
1.3.2 邻接表
1)邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失。
2)邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成。
1.4 图的快速入门案例
思路
(1)存储顶点使用ArrayList
(2)保存矩阵int[][]edges
代码实现
public class Graph {
private ArrayList<Integer> vertexList; // 创建指定节点长度的数组
private int[][] edges; // 存储边的数据
private int edgesNum; // 边的数目
private int weight; // 权重
public static void main(String[] args) {
int n = 8;
int[] vertexs = {1,2,3,4,5,6,7,8};
Graph graph = new Graph(n);
for (int vertex:vertexs) {
graph.insertVertex(vertex);
}
graph.insertEdge(0,1,1);
graph.insertEdge(0,2,1);
graph.insertEdge(1,3,1);
graph.insertEdge(1,4,1);
graph.insertEdge(3,7,1);
graph.insertEdge(4,7,1);
graph.insertEdge(2,5,1);
graph.insertEdge(2,6,1);
graph.insertEdge(5,6,1);
graph.showGraph();
}
public Graph(int n) {
vertexList = new ArrayList<Integer>(n);
edges = new int[n][n];
}
// 返回节点的个数
public int numOfVertex() {
return vertexList.size();
}
// 显示图中的矩阵
public void showGraph() {
for (int[] edge:edges) {
System.out.println(Arrays.toString(edge));
}
}
// 得到边的数目
public int numOfEdges() {
return edgesNum;
}
// 返回节点下标i对应的数组
public int showVertexList(int i) {
return vertexList.get(i);
}
// 返回v1、v2的权值
public int getWeightOfEdge(int v1, int v2) {
return edges[v1][v2];
}
// 插入节点
public void insertVertex(Integer vertex) {
vertexList.add(vertex);
}
// 添加边
public void insertEdge(int v1, int v2, int weight) {
edges[v1][v2] = weight;
edges[v2][v1] = weight;
edgesNum++;
}
}
结果打印: