邻接矩阵

基于邻接矩阵存储的图的广度优先搜索遍历算法的实现(附C++实现代码)

天大地大妈咪最大 提交于 2020-01-27 08:02:32
广度优先搜索算法(BFS) 概念: 广度优先搜素算法(BFS) 的实现类似树的层次遍历,我们在实现他的时候一般借助一个队列来进行实现,利用 队列的先进先出的特点来对图进行广度优先搜索算法的实现。 具体实现思路: 1、 同样,先创建一个 visited_BFS 标记数组来 判断顶点是否已经访问过 了,并且 初始化 visited_BFS数组为false,表示图的所有顶点还没有访问。 2、 借助队列来实现广度优先遍历算法,队列的实现 3、 首先打印起点,然后将 起点v 加入到队列中 4、 然后起点v在邻接矩阵的所在行,读取整一行, 判断与起点相连的其他顶点是否已经访问完毕了,如果还没有访问(即visited为false)并且和起点的权值不为无穷大 ,那么就将这个顶点加入到队列中,然后打印 并且标记 为已经访问 5、 然后读取完这一整行之后,队列进行 出队 操作, 取队头元素作为新的“起点” , 依次类推 ,进行迭代, 停止的条件 是当队列为空时, 即结束 迭代。 具体的细节代码已经详细解释! 具体实现代码如下: void BFS(MyGraph mygraph, char v) {//广度优先搜索算法 LinkQueue* linkQueue = new LinkQueue();//定义一个队列linkQueue linkQueue->initQueue();//队列进行初始化

【数据结构】(邻接矩阵 | 图 | DFS)邻接矩阵深度遍历图

笑着哭i 提交于 2020-01-27 01:58:30
#include < iostream > using namespace std; #define NUM 6 // 定义图 typedef struct{ int a[NUM][NUM]; // 表示点之间的关系 int vex[NUM]; // 各点存的信息 }MGragh; // 图的初始化 void initGragh(MGragh &G, int w[][NUM], int v[]) { for(int i=0;i<NUM;i++){ //每个结点赋值!! G.vex[i] = v[i]; } for(int i=0;i<NUM;i++){ for(int j=0;j<NUM;j++){ G.a[i][j] = w[i][j]; } } } // 定义栈 typedef struct{ int data[NUM]; int top; int stacksize; }stack; // 建栈 void initstack(stack &s) { s.top = -1; s.stacksize = NUM; } // 判空 int emptystack(stack s) { if(s.top == -1) return 1; else return 0; } // 入栈 void push(stack &s,int e) { if(s.top == s.stacksize

基于邻接矩阵的拓扑排序

删除回忆录丶 提交于 2020-01-25 19:48:26
总结下算法好了: (1)构图:每个活动是一个顶点,如果A必须排在B前面,那么有边从顶点A指向顶点B,顶点B的入度+1 (2)遍历所有顶点,将入度为0的顶点入栈 (3)如果栈不为空,则将栈顶出栈,然后将该顶点从图中删掉,即该点指向的点的入度-1,如果减后为0则入栈,重复(3) 简单版的代码,只能举出一种拓扑排序: 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAX_VERTEX_NUM 100 5 6 int ver_num; 7 char vertex[MAX_VERTEX_NUM]; 8 int indeg[MAX_VERTEX_NUM]; 9 int graph[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 10 11 void CreateMGragh() 12 { 13 int i,j; 14 int n1,n2,f1,f2; 15 char ch1,ch2,ch3; 16 while(1){ 17 scanf("%c%c%c",&ch1,&ch2,&ch3); 18 f1 = f2 = 0; 19 for (i=0; vertex[i] != 0; i++){ 20 if (vertex[i] == ch1){ 21 f1 = 1; 22 n1 = i; 23 break; 24 }

图的深度、广度优先、最小生成树、最短路径算法(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的方阵

Dijkstra算法原理

浪子不回头ぞ 提交于 2020-01-08 12:10:49
https://blog.csdn.net/yalishadaa/article/details/55827681 算法有两个集合,集合在动态更新中。 https://www.cnblogs.com/skywang12345/p/3603935.html 学习完了原理 接下来就开始代码实践吧! 邻接矩阵 邻接矩阵是指用矩阵来表示图。它是采用矩阵来描述图中顶点之间的关系(及弧或边的权)。 假设图中顶点数为n,则邻接矩阵定义为: 下面通过示意图来进行解释。 图中的G1是无向图和它对应的邻接矩阵。上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"共7条边。由于这是无向图,所以边(A,C)和边(C,A)是同一条边;这里列举边时,是按照字母先后顺序列举的。 上图右边的矩阵是G1在内存中的邻接矩阵示意图。A[i][j]=1表示第i个顶点与第j个顶点是邻接点,A[i][j]=0则表示它们不是邻接点;而A[i][j]表示的是第i行第j列的值;例如,A[1,2]=1,表示第1个顶点(即顶点B)和第2个顶点©是邻接点。 邻接矩阵无向图(undirected graph)的代码说明 基本定义 class MatrixUDG { private : char mVexs [ MAX ] ; //

力扣207——课程表

风格不统一 提交于 2020-01-07 11:10:07
这道题主要利用拓扑排序,判断该图是否有环,其中还会涉及到邻接矩阵。 原题 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? 示例 1: 输入: 2, [[1,0]] 输出: true 解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。 示例 2: 输入: 2, [[1,0],[0,1]] 输出: false 解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。 说明: 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。 你可以假定输入的先决条件中没有重复的边。 提示: 这个问题相当于查找一个循环是否存在于有向图中。如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。 通过 DFS 进行拓扑排序 - 一个关于Coursera的精彩视频教程(21分钟),介绍拓扑排序的基本概念。 拓扑排序也可以通过 BFS 完成。 原题url:https://my.openwrite.cn/user/article/write 解题

实验四 图的遍历和应用

喜夏-厌秋 提交于 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

【图论】2 图的建立与遍历

最后都变了- 提交于 2020-01-01 12:25:44
在c++中我们应如何表示一张图呢? 表示完成后又应如何调用呢? 1.图的建立 我们有许多方法存住一张图,在csp-s考试范围常用的方法有:   1.邻接矩阵  2.数组模拟链表(前向星)   (当然还有许多其他方法) 邻接矩阵 理解很简单: 对于一个二维数组 a [i] [j],a [i] [j]的值即为 点 i 到点 j 的边的边权。 就是说我们总是将 从i 到 j 的单向边的边权赋给 用以存这个边的二维数组的对应位置 来源: https://www.cnblogs.com/rtrtrt/p/12128617.html

【算法笔记】图的表示

我的未来我决定 提交于 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)。 顶点的入度,表示有多少条边指向这个顶点;顶点的出度,表示有多少条边是以这个顶点为起点指向其他顶点。对应到微博的例子