1、图的简单实现方法——邻接矩阵

表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法。
对于每条边(u,v),置A[u,v]等于true;否则,数组的元素就是false。如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权来标记不存在的边。虽然这样表示非常简单,但是,它的空间需求则为θ(|V|2),如果图的边不是很多,那么这种表示的代价就太大了。若图是稠密(dense)的:|E|=θ(|V|2),则领接矩阵是合适的表示方法。但大多数情况下并非如此。无向图用邻接矩阵表示会浪费一半的空间,稀疏的有向图用邻接矩阵表示会浪费大部分空间,稠密的有向图适合用邻接矩阵表示。

2、图的优化实现方法——邻接表

如果图是稀疏的(sparse),那么更好的解决方法是使用邻接表(adjacency
list)表示。邻接表是一个二维容器,第一维是一个数组,存储所有顶点,第二维是链表,存储所有与这个点领接的点集。此时的空间需求为O(|E|+|V|),它相对于图的大小而言是线性的。

邻接表是表示图的标准方法。无向图可以以类似的方法表示,但每条边将会出现在两个表中,造成空间的双倍冗余。

实现邻接表的方法有很多,基本的选择有两个:一、使用一个映射,在这个映射下,武汉英语学校关键字是顶点,值是那些邻接表。二、关键字是顶点,值是一个包含链的类Vertex。

图的邻接矩阵实现比较简单,这里我们只展示图的邻接表实现方式。

图的邻接表实现总共有3个类,它们分别是:

  • 图的顶点的类:Vertex.java
  • 图的边类:Edge.java
  • 图类:Graph.java

此外,还有一个测试类Test,以方便验证图的构建是否成功,下面是完整的实现代码。

顶点类Vertex:

边类Edge

图类Graph:

测试类Test:

测试结果:

上述实例已经同步到Github,遇到问题的同学可以克隆下来直接运行,链接是:https://github.com/Dodozhou/Algorithm/tree/master/src/main/java/dataStructure/graph/graph_ve

图论——图的邻接表实现——Java语言(完整demo)的更多相关文章

  1. 数据结构Java版之邻接表实现图(十)

    邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.u ...

  2. Codeforces Round #554 (Div. 2) E Neko and Flashback (欧拉路径 邻接表实现(当前弧优化..))

    就是一欧拉路径 贴出邻接表欧拉路径 CODE #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; ...

  3. JAVA实现图的邻接表以及DFS

    一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVer ...

  4. 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)

    行逻辑链接,带行链接信息.程序有空指针BUG,至今未解决.还是C/C++适合描述算法数据结构.以后复杂的算法还是改用C/C++吧. 有BUG的代码,总有一天会换成没有BUG的. package 行逻辑 ...

  5. 图的建立——邻接矩阵表示(C语言+VC6.0平台)

    图的邻接矩阵表示及其建立(无向图) #include <stdio.h> #include <stdlib.h> typedef char VertexType;        ...

  6. 数据结构之---C语言实现图的邻接表存储表示

    // 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...

  7. 瘋耔java语言笔记

    一◐ java概述                                                                                        1.1 ...

  8. bootstrap table 父子表实现【无限级】菜单管理功能

    bootstrap table 父子表实现[无限级]菜单管理功能 实现效果 前端代码 <%@ page language="java" import="java.u ...

  9. 1、Java语言概述与开发环境——Java程序运行机制

    Java语言是一种特殊的高级语言,它既有解释型语言的特性,也具有编译型语言的特征,因为Java要经过先编译后解释两个步骤. 一.高级语言的运行机制 计算机高级语言按程序的执行方式可以分为编译型和解释型 ...

随机推荐

  1. @-webkit-keyframes 动画 css3

    Internet Explorer 10.Firefox 以及 Opera 支持 @keyframes 规则和 animation 属性. Chrome 和 Safari 需要前缀 -webkit-. ...

  2. 获取IP地址的几种方法

    根据ip获取地址的几种方法 1.调用新浪IP地址库 <script type="text/javascript" src="js/jquery.js"&g ...

  3. kmeans 聚类 k 值优化

    kmeans 中k值一直是个令人头疼的问题,这里提出几种优化策略. 手肘法 核心思想 1. 肉眼评价聚类好坏是看每类样本是否紧凑,称之为聚合程度: 2. 类别数越大,样本划分越精细,聚合程度越高,当类 ...

  4. P2586 [ZJOI2008]杀蚂蚁

    传送门 快乐模拟,修身养性 代码长度其实还好,主要是细节多 只要知道一些计算几何基础知识即可快乐模拟,按着题目要求一步步实现就行啦 注意仔细读题,蚂蚁每 $5$ 秒乱走一次的时候是只要能走就走了,不一 ...

  5. npm发布包

    一.发布一个新包第一步:进入要发布的项目根目录,初始化为npm包: npm init 依次按提示填入包名.版本.描述.github地址.关键字.license等 这步完成之后会生成一个package. ...

  6. 测试员小白必经之路----常见的Dos命令

    Dos是什么? 是一个命令行执行的操作系统 进入终端: win + r 运行输入: cmd 当前计算机的本地时间:Time 退出当前正在执行的命令: ctrl +c 设置在多少时间后自动关机: Shu ...

  7. PAT Advanced 1006 Sign In and Sign Out (25 分)

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  8. Educational Codeforces Round 68 (Rated for Div. 2) C. From S To T (字符串处理)

    C. From S To T time limit per test1 second memory limit per test256 megabytes inputstandard input ou ...

  9. 【串线篇】spring boot嵌入式Servlet容器自动配置原理

    EmbeddedServletContainerAutoConfiguration:嵌入式的Servlet容器自动配置? @AutoConfigureOrder(Ordered.HIGHEST_PREC ...

  10. 小程序内置组件swiper,circular(衔接)使用小技巧

    swiper,关于滑块的一些效果无缝,断点,视差等等...我想这里就不用做太多的赘述,这里给大家分享一下实战项目中使用circular(衔接)的一点小特性.小技巧,当然你也可以理解为遇到了一个小坑,因 ...