邻接表

数据结构之DFS与BFS实现

六眼飞鱼酱① 提交于 2020-02-03 04:41:53
本文主要包括以下内容 邻接矩阵实现无向图的BFS与DFS 邻接表实现无向图的BFS与DFS 理论介绍 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 显然,深度优先搜索是一个递归的过程。 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为”宽度优先搜索”或”横向优先搜索”,简称BFS。 它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。 换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2…的顶点。 邻接矩阵实现无向图的BFS与DFS /** *

用邻接矩阵和邻接表创建图

十年热恋 提交于 2020-01-28 16:14:18
#include <iostream> using namespace std; #define INFINITY 65536//无穷大 #define MAX_VERTEX_NUM 10//最大顶点个数 typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网 struct Graph { char vexs[MAX_VERTEX_NUM];//储存顶点 int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 int vexnum, arcnum;//顶点数和边(弧)数 GraphKind kind;//图的种类 }; //确定顶点序号 int LocateVex(Graph *G, char ch) { for (int i = 0; i < G->vexnum; i++) if (G->vexs[i] == ch) { return i;//返回顶点序号 break; } return -1; } void CreateUDN(Graph *G)//创建无向网 { int i, j; char v1, v2;//记录顶点名称 int w;//记录权值 cout << "请输入顶点个数:" << endl;cin >> G->vexnum; cout << "请输入边的个数:" <<

数据结构:利用图的邻接表或邻接矩阵存储结构设计并实现各种操作算法

别等时光非礼了梦想. 提交于 2020-01-25 20:38:14
题目: 图的邻接表和邻接矩阵存储 建立下图的邻接表或邻接矩阵,并输出之; 思路: 邻接矩阵: (1)建立图结构,包含顶点数组,边数组,顶点和边总数 (2)定位函数:可以通过顶点的信息定位到顶点下标 (3)建立邻接矩阵函数:a.输入顶点和边总数; b.录入顶点数组和边数组信息 邻接表: (1)建立图结构(顶点结构数组,顶点和边总数),边结构(边的顶点,权重,连接指针),顶点结构(顶点信息,边连接指针) (2)定位函数:可以通过顶点的信息定位到顶点下标 (3)建立邻接图函数: a.输入顶点和边总数; b.录入顶点数组和边数组信息 c.利用前插法将边与顶点连接 代码块: # include "pch.h" # include <iostream> using namespace std ; # define MVNum 100 typedef char VerTexType ; //顶点数据类型设置为字符 typedef int ArcType ; //边的权值为整型 typedef int OtherInfo ; /*********邻接矩阵***********/ struct AMGraph { VerTexType vexs [ MVNum ] ; //顶点表 ArcType arcs [ MVNum ] [ MVNum ] ; //邻接矩阵 int vexnum ; /

图论——邻接表

十年热恋 提交于 2020-01-18 13:27:01
文章目录 图论——邻接表 邻接表表示 代码 复杂度分析 图论——邻接表 邻接表表示 对于上图的邻接表如下 0:1->2 意思是顶点0保持着一个链表,链表里存放顶点0的邻接顶点 1:0->3 意思是顶点1保持着一个链表,链表里存放顶点1的邻接顶点 2:0->3 3:1->2 代码 public class AdjList { private int V ; //顶点数 private int E ; //边数 private LinkedList < Integer > [ ] adj ; //邻接表,链表数组存储 public AdjList ( String filename ) { File file = new File ( filename ) ; try ( Scanner scanner = new Scanner ( file ) ) { V = scanner . nextInt ( ) ; //顶点数 if ( V <= 0 ) throw new RuntimeException ( "顶点个数必须大于0" ) ; adj = new LinkedList [ V ] ; for ( int i = 0 ; i < V ; i ++ ) { adj [ i ] = new LinkedList < > ( ) ; } E = scanner . nextInt

图的深度、广度优先、最小生成树、最短路径算法(Java版本)

早过忘川 提交于 2020-01-12 01:15:28
介绍 本文提供了图的邻接表、邻接矩阵的Java实现,包括深度优先算法、广度优先算法、prim算法和地杰斯特拉算法。 原理分析 输入图: 深度优先遍历: 广度优先遍历: 注意 :邻接矩阵和邻接表同样的输入遍历的结果可能会不完全一样,原因邻接表的构造并非将小编号的结点连接在靠前的位置,因此导致遍历结果和邻接矩阵不相同,但其在逻辑上仍然满足图的深度优先遍历。另外,最小生成树和最短路径当图中存在两条相同长度的路径时,其结果也不一定唯一。 算法描述 包结构: import java . util . List ; public interface Graph { public void dfsTraverse ( ) ; //深度优先遍历 public void bfsTraverse ( ) ; //广度优先遍历 public List < String > prim ( ) ; //prim算法 public List < String > dijistra ( int v1 , int v2 ) ; //地杰斯特拉算法 } import java . util . ArrayList ; import java . util . List ; import java . util . Scanner ; /** * 使用邻接表 */ public class AGraph

图的存储结构

你说的曾经没有我的故事 提交于 2020-01-10 00:34:35
图的存储结构 这里我们只要介绍五种存储结构的理论和特点以及邻接矩阵,邻接表,边集数组的c语言表示,十字链表和邻接多重表是图的遍历可视化系统要用的存储结构在下一节我们将针对这两中数据结构进行详细讲解包括这两种结构对于图的各种操作(用java描述) 图的存储结构相对于线性表和树来说相对要复杂得多,我们所说的“顶点的位置”或“邻接点的位置“只是一个相对的概念。从图的逻辑定义结构来看,图上任何一个顶点都可以被看成是第一个顶点,任一顶点的邻接点之间不存在次序关系,比如如下四张图: 其实他们是同一个图 正是由于图的复杂性,任意两个顶点之间存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系,也就是说,图不可能用简单的顺序结构来表示。而多重链表的方式,即一个数据域和多个指针组成的结点表示图中的一个顶点,尽管这样可以实现图结构,但这样做是有问题的。如果各个顶点之间的度相差很大,按度最大的顶点设计结点结构会造成很多存储单元的浪费,而若按每个顶点自己的度数设计顶点结构,在操作上也会带来很多不便。所以为了解决此难题,前辈们提出了五种存储结构 1.邻接矩阵 定义:图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中的顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或者弧的信息 对于一个无权图来说: 设图有G个顶点,则邻接矩阵是一个n*n的方阵

在数据库中存储层级结构

假装没事ソ 提交于 2020-01-06 23:37:05
(摘自: http://qinxuye.me/article/storing-hierachical-data-in-database/) 本文参考自 这篇文章 。文章是2003年的,但是现在来看仍然有着实际意义。 层级结构,也叫树形结构。在实际应用中,你经常需要保存层级结构到数据库中。比如说:你的网站上的目录。不过,除非使用类XML的数据库,通用的关系数据库很难做到这点。 对于树形数据的存储有很多种方案。主要的方法有两种:邻接表模型,以及修改过的前序遍历算法。本文将会讨论这两种方法的实现。这里的例子沿用参考文章中的例子,原文使用的PHP,这里将会用Java替代(本例使用Mysql数据库,Java连接Mysql的方法见本文末“备注一”)。 文中使用虚拟的在线食品商店作例子。这个食品商店通过类别、颜色以及种类来来组织它的食品。如图所示: 1)首先是邻接表模型 邻接表相当简单。只需要写一个递归函数来遍历这个树。我们的食品商店的例子用邻接表模型存储时看起来就像是这样: 通过邻接表模型存储法中,我们可以看到Pear,它的父节点是Green,而Green的父节点又是Fruit,以此类推。而根节点是没有父节点的。这里为了方便观看,parent字段使用的字符串,实际应用中只要使用每个节点的ID即可。 现在已经在数据库中插入完毕数据,接下来开始先显示这棵树。 打印这棵树:

实验四 图的遍历和应用

喜夏-厌秋 提交于 2020-01-01 22:02:08
采用邻接矩阵(或邻接表)实现图的遍历 (1)定义邻接矩阵(或邻接表)的存储结构; (2)建立一个无向网G,如下图所示: (3)对G进行深度优先遍历,结出结果; (4)对G进行广度优先遍历,结出结果; # include <iostream> # include <stdio.h> # include <stdlib.h> # include <queue> using namespace std ; # define INFINITY (int)1e9 //最大值无穷 # define MAX_VERTEX_NUM 20 //最大顶点个数 //(1)定义邻接矩阵的存储结构; //由于示例只有权值,没有弧的其他信息,所以可以用int型矩阵表示 typedef enum { DG , DN , UDG , UDN } GraphKind ; //{有向图,有向网,无向图,无向网} typedef struct VNode { int vexs [ MAX_VERTEX_NUM ] ; //顶点向量 int arcs [ MAX_VERTEX_NUM ] [ MAX_VERTEX_NUM ] ; //邻接矩阵 int vexnum , arcnum ; //图的当前顶点数和弧数 GraphKind kind ; //图的种类标志 } MGraph ; int vis [ MAX

【算法笔记】图的表示

我的未来我决定 提交于 2019-12-23 21:01:33
图的表示 1 如何理解“图” 2 邻接矩阵存储方法 3 邻接表存储方法 4 如何存储微博、微信等社交网络中的好友关系? 5 总结 1 如何理解“图” 树中的元素我们称为节点,图中的元素我们就叫作 顶点 (vertex)。图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫作 边 (edge)。 拿微信举个例子。可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好友,对应到图中,就叫作顶点的度(degree),就是跟顶点相连接的边的条数。 微博的社交关系跟微信还有点不一样,或者说更加复杂一点。微博允许单向关注,也就是说,用户 A 关注了用户 B,但用户 B 可以不关注用户 A;如果用户 A 关注了用户 B,我们就在图中画一条从 A 到 B 的带箭头的边,来表示边的方向。如果用户 A 和用户 B 互相关注了,那我们就画一条从 A 指向 B 的边,再画一条从 B 指向 A 的边。我们把这种边有方向的图叫作“有向图”。 在无向图中有“度”这个概念,表示一个顶点有多少条边。 在有向图中,我们把度分为入度(In-degree)和出度(Out-degree)。 顶点的入度,表示有多少条边指向这个顶点;顶点的出度,表示有多少条边是以这个顶点为起点指向其他顶点。对应到微博的例子

数据库表设计,没有最好只有最适合(邻接表、路径枚举、嵌套集、闭包表)

若如初见. 提交于 2019-12-18 05:50:31
我们在设计数据库的时候,是否会突破常规,找到最适合自己需求的设计方案,下面来举个例子: 常用的邻接表设计,都会添加 一个 parent_id 字段,比如区域表(国、省、市、区): CREATE TABLE Area ( [id] [int] NOT NULL, [name] [nvarchar] (50) NULL, [parent_id] [int] NULL, [type] [int] NULL ); name:地域的名称, parent_id 是父ID,省的父ID是国,市的父ID 为省,以此类推。 type 是区域的阶级: 1:国,2:省,3:市,4:区 在层级比较确定的情况下,这么设计表格没有什么问题,调用起来也很方便。 但是使用这种邻接表设计方式,并不能满足所有的需求,当我们不确定层级的情况下,假设我有下面一个评论结构: 用邻接表记录这个评论的数据(comments 表): comment_id parent_id author comment 1 0 小明 我不大认同这个观点 2 1 小张 我也不认同 3 2 小红 我同意楼上 4 1 小全 你为什么不认同呢 5 4 小明 我以前遇到过这情况 6 5 小张 那也不代表你所说是对的 7 5 小新 这个视情况而定吧 大家有没发现,这么设计表,如果要查询一个节点的所有后代,是很难实现的