引言

有关图的概念可参考博文数据结构之图的概述


比如有个这样的无向图(看起来很像二叉树吧,其实二叉树是一种特殊的图),通过邻接链表表示如下:


我们通过索引表示顶点,索引指向的为一个链表(表示该顶点相邻的所有顶点,比如顶点2相邻的顶点为:0,1,3)。因为是无向图,若增加0-2边,会在0对应的链表中增加2,相应地也会在2对应的链表中增加0。

无向图的邻接集实现

package com.algorithms.graph;import java.util.HashSet;
import java.util.Set;/*** 无向图** 使用0到V-1来表示一个含有V个顶点的图中的各个顶点。*** @author yjw* @date 2019/5/15/015*/
@SuppressWarnings("unchecked")
public class Graph {/*** 顶点数*/private int vertexNum;/*** 边数*/private int edgeNum;/*** 邻接集:不允许存在平行边*/private Set<Integer>[] adj;public Graph(int v) {this.vertexNum = v;this.edgeNum = 0;adj = (Set<Integer>[]) new HashSet[vertexNum];/*** 代表顶点0到v-1*/for (int i = 0; i < v; i++) {adj[i] = new HashSet<>();}}public int vertexNum() {return vertexNum;}public int edgeNum() {return edgeNum;}/*** 增加v<->w的边* @param v* @param w*/public void addEdge(int v,int w) {/*** 两个端点都加就是无向图了*/if (adj[v].add(w) && adj[w].add(v)) {edgeNum++;}}/*** 增加边的快速方法* @param start 起始节点* @param ends 结束节点数组*/public void addDiEdges(int start,int ... ends) {for (int w : ends) {addEdge(start,w);}}public void addEdge(int ... edges) {if (edges.length % 2 != 0) {throw new IllegalStateException("顶点数必须为2的整数倍");}for (int i = 0; i < edges.length -1; i+=2) {addEdge(edges[i],edges[i+1]);}}/*** 计算v的度* @param v* @return*/public int degree(int v) {int degree = 0;for (int w : adj(v)) {degree++;}return degree;}/*** 返回由v出发指向的顶点集合* @param v* @return*/public Iterable<Integer> adj(int v) {return adj[v];}@Overridepublic String toString() {StringBuilder s = new StringBuilder("(" + vertexNum + " vertices, " + edgeNum + " edges)\n");for (int v = 0; v < vertexNum; v++) {s.append(v).append(": ");for (int w: this.adj(v)) {s.append(w).append(" ");}s.append("\n");}return s.toString();}public static void main(String[] args) {Graph g = new Graph(6);
/*      g.addEdge(0,2);g.addEdge(2,1);g.addEdge(2,3);g.addEdge(3,4);g.addEdge(3,5);*/g.addEdge(0,2,2,1,2,3,3,4,3,5);System.out.println(g);}
}

实例化无向图:

我们可通过该方法很方便的构造前面结构的图结构。
g.addEdge(0,2,2,1,2,3,3,4,3,5);

打印如下:

(6 vertices, 5 edges)
0: 2
1: 2
2: 0 1 3
3: 2 4 5
4: 3
5: 3

图论算法——无向图的邻接链表实现相关推荐

  1. 图论算法 有图有代码 万字总结 向前辈致敬

    图的定义 背景知识 看到这篇博客相信一开始映入读者眼帘的就是下面这幅图了,这就是传说中的七桥问题(哥尼斯堡桥问题).在哥尼斯堡,普雷格尔河环绕着奈佛夫岛(图中的A岛).这条河将陆地分成了下面4个区域, ...

  2. 图论算法(一):最短路径

    基本介绍 1736年,瑞士数学家Euler(欧拉)在他的一篇论文中讨论了哥尼斯(Knigsberg)七桥问题,由此诞生了一个全新的数学分支--图论(Graph Theory).在经历了200多年的发展 ...

  3. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

    摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...

  4. warshall算法求传递闭包c++_【建模小课堂】图论算法

    图论算法 图论算法在计算机科学中扮演着很重要的角色,它提供了对很多问题都有效的一种简单而系统的建模方式.很多问题都可以转化为图论问题,然后用图论的基本算法加以解决.这类问题算法主要包括Dijkstra ...

  5. 0102数据结构和图处理算法-无向图-数据结构和算法(Java)

    文章目录 1 数据类型 2 图的表示方法 3 无向图的实现 4 图处理算法的设计模式 后记 1 数据类型 要处理各种图的算法,我们首先看一份定义了图的基本操作的API,如下表1-1所示: public ...

  6. 补学图论算法:算法竞赛入门经典(第二版)第十一章:

    补学图论算法:算法竞赛入门经典(第二版)第十一章: 倒排索引还没有实现! 下面是左神的图论算法,并查集笔记.和一个美团题目. ''' https://www.nowcoder.com/live/11? ...

  7. 图论算法小结:网络流及其算法

    个人说明:最近学到了图论算法,但网络流这部分颇难理解,于是在网上找到了一片比较好的讲解博客.转载之~ 网络流(Network Flow) 将每条有向边想象成传输物质的管道.每个管道都有一个固定的容量, ...

  8. c语言tarjan算法,无向图求割点和割边——Tarjan算法

    无向图中求割点集和割边集--Tarjan算法 割点和割边 定义 在一个无向图中,如果删除了某个顶点及与之相连的所有边,产生了一更大连通分量的子图,这样的顶点被称为割点或关节点.对于一个图的所有割点的集 ...

  9. 图论算法(5):图的广度优先遍历 BFS

    本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src 查看文章内的图片可能需要科学上网! 因为 ...

  10. 图论算法:图论基础介绍

    图论相关定义 一个图(graph) G = (V, E) 由顶点(vertex)的集合 V 和 边(edge)的集合E组成,有时也把边称作弧(arc).如果图中的边是带方向的,那么图就是有向图(dir ...

最新文章

  1. Mycat连接数据库之后导致表名全小写的问题分析研究
  2. web记录文章浏览数_内网渗透 -- 获取内网浏览器历史记录等相关信息
  3. 描写火车站场景_关于描写火车站的句子
  4. 图胜千言:电商支付架构设计
  5. java中序列化之子类继承父类序列化
  6. 强力推荐:关于内存中栈和堆的区别
  7. 十大算法 — 冒泡排序法【C语言代码诠释】
  8. memcache简单操作
  9. 如何使用NFC读写器读卡器ACR122U-A9|ACR1251U-M1|ACR1252U读写NDEF格式的智能海报|网址|文本等数据的方法与步骤
  10. python控制电机转动_Micropython TurnipBit 旋转按钮控制直流电机转速(儿时记忆中的吊扇)...
  11. 转盘抽奖 canvas 抽奖 H5 源码
  12. 3D打印经验分享导航
  13. xpath 爬取某网站图片
  14. R语言h2o深度学习分类
  15. [唐诗]秋夜喜遇王处士-王绩
  16. 记录Win10正确安装CUDA和cuDNN的过程(记录一些坑)
  17. 关于win11下chrome浏览器存在卡顿问题
  18. springboot文件上传提示临时文件夹不存在
  19. ArcGIS二次开发基础教程(06):有关图层的基本操作
  20. 普通人如何架设一个简单的服务器攻略

热门文章

  1. title()、upper()、lower()的用法
  2. Android雁翎刀之ImageView之定制头像
  3. JS数据结构第五篇 --- 二叉树和二叉查找树
  4. 关于Linux下使用Windows应用程序的尝试总结
  5. Plants vs. Zombies(二分好题+思维)
  6. python 多线程,进程的理解
  7. Qt 地址薄 (一) 界面设计
  8. javascript高级程序设计笔记-第八章(BOM)
  9. Linux系统下编译连接C源代码
  10. [双调]落梅风(寿阳曲).焰火似龙