图用java数据结构表示_Java数据结构与算法之图

本文介绍了图的基本概念,包括顶点、边、无向图、有向图和带权图,并探讨了图的两种表示方式——邻接矩阵和邻接表。通过Java代码实例展示了如何使用邻接矩阵存储和操作图,包括插入顶点、添加边、显示图的矩阵等操作。
摘要由CSDN通过智能技术生成

六、图

1. 图基本介绍

当我们需要表示多对多的关系时,这里我们就用到了图。

1.1 图的举例说明

图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。

2861fe38a52a5eae9fa9dd40be9210eb.png

1.2 图的常用概念

1)顶点(vertex)

2)边(edge)

3)路径

4)无向图

ec1c39f3be82f082c6d15c7e1e8732ea.png

5)有向图

3931fb7e189affbe00c6e7909d626552.png

6)带权图

99a094495606ccb944d5c75d83984857.png

1.3 图的表示方式

1.3.1 邻接矩阵

邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1....n个点。

3bb85f4b06cc16750a196c86ffb449ea.png

1.3.2 邻接表

1)邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失。

2)邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成。

597c127bafc6399a7819dcce97ecbea4.png

1.4 图的快速入门案例

cc3b1ef05bfd97407ac09c6bfcf29f1f.png

思路

(1)存储顶点使用ArrayList

(2)保存矩阵int[][]edges

代码实现

public class Graph {

private ArrayList 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(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++;

}

}

结果打印:

bb1579a9612c503c2a1b5fd7cafc907a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值