图论——图的邻接表实现——Java语言(完整demo)

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

原文地址:https://www.cnblogs.com/zhangyiqinga/p/9777135.html

时间: 2024-10-07 16:10:40

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

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

邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.util.List; public class Table { private List<List<Character>> list; private List<Character> headNodes; private int n; private int nVerts;

JAVA邻接表实现拓扑排序

由于一直不适用邻接表 ,现在先贴一段使用邻接矩阵实现图的拓扑排序以及判断有无回路的问题.自己做的图.将就看吧. package TopSort; import java.util.LinkedList; import java.util.Scanner; /*拓扑序列:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性 * 序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前. * */ p

用邻接表实现某个点入度和出度

#include <cstdio> #include <cstring> #include <cctype> using namespace std; typedef struct node{//邻接表上的节点 int n; struct node * next; } GNode; typedef struct graph{//图的整个结构 int cn;//顶点个数 int bn;//边的个数 GNode *list;//顶点的数组相当于list[]; }Graph;

用邻接表实现无向图的创建与输出

1 #include<stdio.h> 2 #include <iostream> 3 #include<algorithm> 4 using namespace std; 5 #define MVNum 100 6 typedef struct ArcNode // 边表结点 7 { 8 int adjvex; // 邻接点域,存储该顶点对应的下标 9 //int info; //用于存储权值,对于非网图可以不需要 10 struct ArcNode *nextarc

JAVA实现图的邻接表以及DFS

一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVertex) int value; // 权值 EdgeNode nextArc; // 指向下一条弧 } // 邻接表节点的类型 class VertexNode { String name; EdgeNode firstArc = new EdgeNode(); // 指向第一条弧 } public

Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]:大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样.但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿.很多人都会碰到过这样的情况:你实现了一个新功能或修复了一个缺陷,并且对自己的修改很满意.但其他人看了你的代码后--也许发生在代码审查环节,完全不买账!对于什么是好代码,什么是坏代码,存在分歧很正常!设计模式的改变设计模式是人们熟悉的另一种设计思想,

简单的入门Android开发和Java语言基础[图]

简单的入门Android开发和Java语言基础[图]前言:去年年底到今年年初,我做过简单的智能家居,也实现过一些简单的直连和远程的智能家居.于是就将最简单的通信发布出来:智能家居简单实现-使用ESP8266简单实现和APP通讯由于这方面的资料少之又少,所以阅读量飙升的很快.也有很多人加了好友问我问题.通过问题我发现,很多都是学硬件的.或是做智能家居方面的学生,基本都不会 Android 开发的.问也有很多问我怎么学 Android 开发的.很多的人认知还是停留在学习这种软件开发技术需要去培训机构

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

// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 3 // 顶点字符串的最大长度+1 #define MAX_VERTEX_NUM 20 typedef int InfoType; // 存放网的权值 typedef char VertexType[MAX_NAME]; // 字符串类型 typedef enum{DG, DN, AG

数据结构与算法经典问题解析 Java语言描述pdf

下载地址:网盘下载 内容简介 本书以Java为描述语言,介绍了数据结构与算法的基本知识.书中结合企业界的工程实践提炼教学内容,特别对数据结构中易混淆的问题进行了梳理,对每一个问题提出不同的解决方案.本书是一本优秀的数据结构方面的教材. 目录 译者序 前言 第1章绪论1 1.1变量1 1.2数据类型1 1.3数据结构2 1.4抽象数据类型2 1.5什么是算法3 1.6为什么需要算法分析3 1.7算法分析的目的3 1.8什么是运行时间分析4 1.9如何比较算法4 1.10什么是增长率4 1.11常用