无向图以及图的java代码实现

小鱼儿 2024-03-30 11:32 161阅读 0赞

1. 图的定义

定义:图是由一组顶点和一组能够将两个顶点相连的边组成的

1.1特殊的图

  1. 自环:即一条连接一个顶点和其自身的边;
  2. 平行边:连接同一对顶点的两条边;
    在这里插入图片描述

1.2图的分类

按照连接两个顶点的边的不同,可以把图分为以下两种:
无向图:边仅仅连接两个顶点,没有其他含义;
有向图:边不仅连接两个顶点,并且具有方向

2.无向图

相邻顶点
当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点。

某个顶点的度就是依附于该顶点的边的个数
子图
是一幅图的所有边的子集(包含这些边依附的顶点)组成的图;
路径
是由边顺序连接的一系列的顶点组成

是一条至少含有一条边且终点和起点相同的路径
连通图
如果图中任意一个顶点都存在一条路径到达另外一个顶点,那么这幅图就称之为连通图
连通子图
一个非连通图由若干连通的部分组成,每一个连通的部分都可以称为该图的连通子图
在这里插入图片描述

3.图的存储数据结构

要表示一幅图,只需要表示清楚以下两部分内容即可:
**1. 图中所有的顶点;

  1. 所有连接顶点的边;**
    常见的图的存储结构有两种:邻接矩阵邻接表

3.1邻接矩阵

  1. 使用一个V*V的二维数组int[V][V] adj,把索引的值看做是顶点;
  2. 如果顶点v和顶点w相连,我们只需要将adj[v][w]和adj[w][v]的值设置为1,否则设置为0即可。

在这里插入图片描述

3.2邻接表

1.使用一个大小为V的数组 Queue[V] adj,把索引看做是顶点
2.每个索引处adj[v]存储了一个队列,该队列中存储的是所有与该顶点相邻的其他顶点

在这里插入图片描述
邻接表的空间并不是是线性级别的,所以后面我们一直采用邻接表这种存储形式来表示图。

4.图的实现

4.1 图的API设计

在这里插入图片描述

4.2 图的代码实现

  1. public class Graph {
  2. //顶点数目
  3. private final int V;
  4. //边的数目
  5. private int E;
  6. //邻接表
  7. private Queue<Integer>[] adj;
  8. public Graph(int V){
  9. //初始化顶点数量
  10. this.V = V;
  11. //初始化边的数量
  12. this.E=0;
  13. //初始化邻接表
  14. this.adj = new Queue[V];
  15. //初始化邻接表中的空队列
  16. for (int i = 0; i < adj.length; i++) {
  17. adj[i] = new Queue<Integer>();
  18. }
  19. }
  20. //获取顶点数目
  21. public int V(){
  22. return V;
  23. }
  24. //获取边的数目
  25. public int E(){
  26. return E;
  27. }
  28. //向图中添加一条边 v-w
  29. public void addEdge(int v, int w) {
  30. //把w添加到v的链表中,这样顶点v就多了一个相邻点w
  31. adj[v].enqueue(w);
  32. //把v添加到w的链表中,这样顶点w就多了一个相邻点v
  33. adj[w].enqueue(v);
  34. //边的数目自增1
  35. E++;
  36. }
  37. //获取和顶点v相邻的所有顶点
  38. public Queue<Integer> adj(int v){
  39. return adj[v];
  40. }
  41. }

发表评论

表情:
评论列表 (有 0 条评论,161人围观)

还没有评论,来说两句吧...

相关阅读

    相关 相关概念

    图的定义:  图在数据结构中是中一对多的关系,一般分为无向图与无向图  常用 邻接矩阵 或者 邻接链表 来表示图中结点的关系  ⑴图是由顶点集V和顶点间的关系集合E(边的...

    相关 加权

    用一个更加通用的API来处理Edge对象,能够使程序适用于更加常见的场景。 \-Edge.h 带权重的边的数据类型 ifndef __EDGE_H__ de