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. [转帖]kafka基础知识点总结

    kafka基础知识点总结 https://blog.csdn.net/qq_25445087/article/details/80270790 需要学习. 1.kafka简介 kafka是由Apach ...

  2. Zend_Cache的使用

    一.Zend_Cache快速浏览 Zend_Cache 提供了一个缓存任何数据的一般方法. 在Zend Framework中缓存由前端操作,同时通过后端适配器(File, Sqlite, Memcac ...

  3. HNCPC2019H 有向图

    题目 设\(f_i\)表示经过\(i\)的期望次数.那么显然答案\(ans_j=\sum\limits_{i=1}^nf_iP_{i,j}\). 我们可以轻松地列出转移式子: \[ f_1=\sum\ ...

  4. HDU4471 Homework

    题目 预处理转移矩阵的\(2^k\). 然后把关键点按下标排序. 每次用类似于矩阵快速幂的方法求出两个关键点中间的转移矩阵. #include<bits/stdc++.h> using n ...

  5. MongoDB的使用学习之(六)MongoDB的高级查询之条件操作符

    此文分为两点,主要是在第二点--java 语法,但是按顺序必须先把原生态的语法写出来 (还有一篇文章也是不错的:MongoDB高级查询用法大全(包含MongoDB命令语法和Java语法,其实就是我整理 ...

  6. 2019 计蒜之道 复赛 D. “星云系统”(单调栈)

    VIPKID 是在线少儿英语教育平台,网络稳定是在线教育课程质量的红线,VIPKID 为此推出了全球最稳定的教育网络系统 -- "星云系统".星云系统目前建立了覆盖全球 3535 ...

  7. 你真的懂git rebase吗?

    前段时间由于某种原因,开始接手开发公司前端Vue搭建的项目 该前端项目采用的是基于git rebase的形式去合并代码,而我之前使用git一直都是采用merge的形式合并分支代码,对于rebase一概 ...

  8. java并发学习--第十章 java内存模型的内存语义

    一.锁的内存语义 所为的java内存模型的内存语义指的就是在JVM中的实现原则. 锁的内存语义:锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 我们把上面这句话再整理下: ...

  9. spring 管理bean

    目录结构: Person.java package com.wss.entity; import com.wss.service.doHomeWork; public class Person { p ...

  10. thinkphp5.0.19 表单令牌

    助手函数token() [F:\phpStudy\WWW\csweb\thinkphp\helper.php] request类token()方法 [F:\phpStudy\WWW\csweb\thi ...