为什么要有图
当我们需要表示多对多的关系时,就需要用到图了。
图的基本介绍
图是一种数据结构,其中节点可以具有零个或多个相邻的元素。两个结点之间的连接称为边,结点也可以称为顶点。
如图:
图常用的概念
-
顶点(vertex)
-
边(edge)
-
路径
-
无向图(下图)
-
有向图
-
带权图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PlZxd1x1-1659253780165)(https://xuemingde.com/pages/image/2022/07/25/191335SjaTNn.png)]
图的表示方式
二维数组表示
也叫 邻接矩阵
链表
也叫 邻接表
入门案例
package com.algorithm.graph;
import java.util.ArrayList;
import java.util.Arrays;
/**
* @author yons
* 无边向
*/
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 vertex : vertexs) {
graph.insertVertex(vertex);
}
//添加边
//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){
//初始化矩阵和vertexList
vertexList = new ArrayList<>(n);
edges = new int[n][n];
}
/**
* 返回结点个数
* @return
*/
public int getNumOfVertex(){
return vertexList.size();
}
/**
* 返回边的数目
* @return
*/
public int getNumOfEdges(){
return numOfEdges;
}
/**
* 返回下标所对应的值
* @param index
* @return
*/
public String getVertexByIndex(int index){
return vertexList.get(index);
}
/**
* 显式邻接矩阵
*/
public void showGraph(){
for (int[] edge : edges) {
System.out.println(Arrays.toString(edge));
}
}
/**
* 返回两个顶点之间的权值
* @param v1
* @param v2
* @return
*/
public int getWeight(int v1,int v2){
return edges[v1][v2];
}
/**
* 插入顶点
* @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++;
}
}
输出:
[0, 1, 1, 0, 0]
[1, 0, 1, 1, 1]
[1, 1, 0, 0, 0]
[0, 1, 0, 0, 0]
[0, 1, 0, 0, 0]
如果在设置边的时候,设置如下
//添加边
//A-B A-C B-C B-D B-E
graph.insertEdge(0,1,23);
graph.insertEdge(0,2,12);
graph.insertEdge(1,2,34);
graph.insertEdge(1,3,56);
graph.insertEdge(1,4,41);
边的权值设置为实际长度,输出的结果为:
[0, 23, 12, 0, 0]
[23, 0, 34, 56, 41]
[12, 34, 0, 0, 0]
[0, 56, 0, 0, 0]
[0, 41, 0, 0, 0]