图
图的基本介绍
为什么要有图?
-
线性表局限于一个直接前去和一个直接后继的关系
-
树也只能有一个直接前去也就是父节点
-
当我们表示 多对多的关系是=时,就用到了图
图的举例说明
-
图是一种数据结构,其中节点可以具有零个或多个相邻元素。
-
两节点之间的连接称为边,节点称为顶点
如图:
图的常用概念
-
顶点:节点
-
边:顶点间的连接
-
路径:节点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++;