![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图
文章平均质量分 65
yuzhang_zy
现在的我不是最好的我,未来的我才是最好的我,每一篇博客都记录着我的成长
展开
-
565 数组嵌套(图论思想-求解所有环的最大长度)
1. 问题描述:索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则。假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]... 以此类推,不断添加直到S出现重复的元素。示例1:输入: A = [5,4,0,3,1,6,2]输出: 4解释:A[0] = 5, A[1] = 4, A[2] =..原创 2021-07-24 11:17:49 · 288 阅读 · 0 评论 -
最短路径spfa算法
1. 问题描述:给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible。数据保证不存在负权回路。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。如果路径不存在,则输出 impossible。数据范围1≤n,m原创 2021-05-03 22:20:29 · 476 阅读 · 0 评论 -
1514 概率最大的路径(bfs、dfs)
1. 问题描述: 给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组成,其中 edges[i] = [a, b] 表示连接节点 a 和 b 的一条无向边,且该边遍历成功的概率为 succProb[i] 。指定两个节点分别作为起点 start 和终点 end ,请你找出从起点到终点成功概率最大的路径,并返回其成功概率。如果不存在从 start 到 end 的路径,请 返回 0 。只要答案与标准答案的误差不超过 1e-5 ,就会被视作正确答案。示例 1:e..原创 2020-07-18 17:31:47 · 967 阅读 · 1 评论 -
1334 阈值距离内邻居最少的城市(Dijkstra算法)
1. 问题描述:有 n个城市,按从 0 到 n-1编号。给你一个边数组edges,其中 edges[i] = [fromi, toi, weighti]代表fromi和toi两个城市之间的双向加权边,距离阈值是一个整数distanceThreshold。返回能通过某些路径到达其他城市数目最少、且路径距离 最大 为distanceThreshold的城市。如果有多个这样的城市,则返回编号最大的城市。注意,连接城市 i 和 j 的路径的距离等于沿该路径的所有边的权重之和。示...原创 2020-06-07 11:49:17 · 509 阅读 · 0 评论 -
207 课程表(拓扑排序)
1. 问题描述:你这个学期必须选修 numCourse 门课程,记为0到numCourse-1 。在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释:总共有 2 门课...原创 2020-04-08 17:48:14 · 427 阅读 · 0 评论 -
C++实现的邻接表
1. 在学习图的存储方式中,邻接矩阵和邻接表是两种比较常用的存储图的方式,下面使用的是C语言实现的邻接表2. 具体的实现过程如下:① 首先使用结构体声明图的结构体,图中顶点的结构体,以及指向下一条边的结构体,这些可以参照严蔚敏版的数据结构来写出具体的数据结构:typedef struct ArcNode{ int adjvex;//该边所指向的节点的位置 struct ArcN...原创 2019-06-17 20:09:54 · 9233 阅读 · 4 评论 -
Floyd算法(全源最短路径)
1. Floyd算法是用来解决全源最短路径的问题,即给定图G(V,E),求任意两点u,v之间的最短路径长度,算法的思想比较简单,如果存在顶点k,使得以k作为中间顶点时顶点i和顶点j的当前最短距离缩短,则将dis[i][j]更新为dis[i][k] + dis[k][j],由于存在三层循环所以时间复杂度是O(n ^ 3),n为顶点的数量2. 需要注意的问题是最外层的k循环不能够放入到最里面,因为...原创 2019-06-12 10:58:30 · 1329 阅读 · 0 评论 -
Dijkstra算法(单源路径最短算法)
1. Dijstra算法求解的是图中一个顶点到其余顶点的最短路径Dijstra算法思想:设有两个顶点集合S和T,集合S中存放的图中已经找到最短路径的顶点,集合T中存放图中剩余顶点,初始状态的时候,集合S中只包含源点v0,然后不断从集合T中选取到顶点v0路径长度最短的顶点v并入到集合S中去,集合S每并入一个新的顶点,都要修改顶点v0到集合T中顶点的最短路径长度值总结起来我感觉主要有两步:...原创 2019-06-12 09:57:24 · 917 阅读 · 0 评论 -
Dijkstra算法输出最短路径
1. 之前我们使用Dijstra算法可以求解出从源点到达其余顶点的最短距离,那么怎么样求解出源点到达v顶点最短距离中所经过的顶点呢?2. 算法的执行过程如下:① 其实也很简单,我们只需要在原来使用Dijstra算法求解最短距离的基础上增加上一个pre数组来记录从源点s到顶点v的最短距离中的前一个节点,这样当我们发现可以通过中间顶点u使得从源点s到顶点v的距离更短的时候可以记录从源点到达顶点...原创 2019-06-21 17:30:25 · 2960 阅读 · 3 评论 -
Prim算法(最小生成树)
1. Prim算法也叫做普里姆算法,下面是普里姆算法的基本思想从图中任意取出一个顶点,把它当成一棵树,然后从这棵树相接的边中选择一条最短的边(权值最小)的边,并将这条边及其所连接的顶点也一起并入到这棵树中,此时得到的是一颗有两个顶点的树,然后从这棵树相接的边中选取一条最短的边,并将这条边及其所连接的顶点也一起并入到当前的树中,得到一颗具有三个节点的树,以此类推直到所有的顶点的纳入到树中为止,此...原创 2019-06-11 20:41:47 · 26617 阅读 · 1 评论 -
C语言实现邻接表的深度优先遍历
1. 对于图的遍历主要有两种遍历方式:深度优先遍历和广度优先遍历,对于图的遍历与树不同的是需要增加一个标记数组来对访问过的节点进行标记,假如访问过了我们就不能够再进行访问了2. 下面是使用C语言实现深度优先遍历的过程:①首先需要存储一个图,下面使用的是邻接表的方式来存储图(使用邻接表来存储图在我的上一篇博客有写:https://blog.csdn.net/qq_39445165/artic...原创 2019-06-17 20:39:35 · 9255 阅读 · 7 评论 -
C语言实现邻接表的广度优先搜索
1.对于图的遍历主要有两种遍历方式:深度优先遍历和广度优先遍历,对于图的遍历与树不同的是需要增加一个标记数组来对访问过的节点进行标记,假如访问过了我们就不能够再进行访问了2. 下面是使用C语言实现广度优先遍历的过程:①首先需要存储一个图,下面使用的是邻接表的方式来存储图(使用邻接表来存储图在我的上一篇博客有写:https://blog.csdn.net/qq_39445165/arti...原创 2019-06-17 22:00:04 · 1817 阅读 · 0 评论 -
最短路径求解(Dijkstra算法)
1. 问题描述(问题来自于PAT A 1003Emergency)As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of ...原创 2019-06-21 20:24:06 · 2741 阅读 · 0 评论 -
Dijkstra算法的总结
1. 对于最短路径算法我们最常使用的方法是使用Dijkstra算法来进行解决,但是在最短路径算法中往往是Dijkstra算法的一些变体,但是核心不变的是需要求解从源点s到顶点v的最短路径,在题目中更多出现的是另外一种情况是起点到达终点的路径是不止一条的,于是存在两条以及以上可以到达最短距离的路径题目就会给出一个第二标尺(第一标尺是距离)要求在所有最短路径中选择第二标尺最优的一条路径,而第二标尺常见...原创 2019-06-21 21:00:39 · 1575 阅读 · 0 评论 -
Dijkstra算法的改进(Dijkstra算法 + dfs)
1. 我们在学习Dijkstra算法的时候可以知道求解最短路径不可能只是简单的让我们求解出从源点到其余顶点的最短路径,更多的是根据Dijkstra算法来进行进一步的改变,从而达到我们解决问题的目的,而在我们遇到的使用Dijkstra算法求解最短路径的往往也是相应的变体形式,在原来Dijkstra算法的基础上增加若干个的条件,比如最短路径上的点权之和、边权之和或者求解出存在多条最短下最短路径的条数...原创 2019-06-22 12:11:42 · 5660 阅读 · 1 评论 -
C++实现的Prim算法(最小生成树)
1. 最小生成树是一个在给定的无向图G(V,E)中求出一棵树T,使得这棵树拥有图G中的所有有顶点,且所有边都是来自于图G中的边,并且满足这棵树的边权之和是最小的对于最小生成树需要掌握以下三个性质:① 最小生成树是树,因此其边数是等于顶点数减1,而且树内一定不会有环② 对于给定的图G(V,E)其最小生成树可以是不唯一的,但是边权这个是唯一的③ 由于最小生成树是在无向图中产生的,所...原创 2019-06-27 17:26:08 · 15034 阅读 · 6 评论 -
C++实现的kruskal算法(最小生成树)
1. 求解最小生成树算法主要有两种,分别是prim算法与kruskal算法,下面使用的是C++语言实现的kruskal算法,之前使用Java语言描述Kruskal算法的时候已经比较详细了,博客地址为:https://blog.csdn.net/qq_39445165/article/details/91949052. 下面是具体的C++代码:#include<cstdio>...原创 2019-06-27 17:32:39 · 3701 阅读 · 0 评论 -
Dijkstra算法多条最短路径下最短路径的记录
1. 我们在使用Dijkstra算法求解源点到其余顶点的最短路径的时候,在大多数情况下最短路径是只有一条的,但是也有可能存在着多条最短路径的情况,所以之前使用整型的pre[]数组来记录当前节点的前驱节点的方法就不再适用这个问题了,所以需要另外的数据结构来进行记录,而题目中告诉我们可能存在着多条最短的路径的时候往往会要求在多条最短路径下的另外一个条件,比如是边权之和最小或者最大,点权之和最小或者最大...原创 2019-08-04 09:55:56 · 5684 阅读 · 3 评论 -
C++实现Dijkstra算法(单源路径最短算法)
1. Dijstra算法求解的是有向图中一个顶点到其余顶点的最短路径Dijkstra算法思想:设有两个顶点集合S和T,集合S中存放的图中已经找到最短路径的顶点,集合T中存放图中剩余顶点,初始状态的时候,集合S中只包含源点v0,然后不断从集合T中选取到顶点v0路径长度最短的顶点v并入到集合S中去,集合S每并入一个新的顶点,都要修改顶点v0到集合T中顶点的最短路径长度值总结起来我感觉主要有两步...原创 2019-06-21 14:35:05 · 1570 阅读 · 0 评论 -
C++邻接矩阵存储图的深度优先搜索
1.在数据结构中对于图的存储主要有三种方式,分别为邻接矩阵,邻接表和边集,前两种比较常用,下面使用的是C++语言邻接矩阵来存储图并实现深度优先搜索遍历2. 下面是具体的执行过程:① 对于深度优先遍历邻接矩阵存储的图来说比较简单,只需要使用一个标记数组来标记当前的顶点是否已经被访问即可,从图的一个顶点开始寻找邻接点,也就是当前顶点与其他存在联系的顶点,每访问过一个顶点那么标记顶点已被访问...原创 2019-06-21 13:30:18 · 1133 阅读 · 0 评论 -
C++邻接矩阵存储图的广度优先搜索
1. 在数据结构中对于图的存储主要有三种方式,分别为邻接矩阵,邻接表和边集,前两种比较常用,下面使用的是C++语言邻接矩阵来存储图并实现广度优先搜索遍历2. 下面是具体的实现过程:① 实现邻接矩阵存储图主要是使用的二维数组来存储从起始顶点到结束顶点相应的值即可,假如是无向图来说我们需要从起始顶点和结束顶点两端进行标记,经常的做法是标记为1表示,即graph[u][v] = 1和graph[...原创 2019-06-21 12:03:35 · 528 阅读 · 0 评论 -
使用邻接表来表示图
1. 图的表示有几种方法:一是使用邻接矩阵(其实就是二维数组)表示,二是使用邻接表来表示 ,三是使用边集来表示下面使用邻接表来表示2. 首先定义一个图的节点,其中包含几个属性,包含图节点的值,邻居节点,当前节点是否被访问的标志,还有就是对于属性相应的的操作,包括增加邻居节点,获取邻居节点,获取当前节点的邻居节点的个数import java.util.ArrayList;imp...原创 2019-02-09 11:27:34 · 2366 阅读 · 0 评论 -
四连通检测
1. 问题描述:八连通检测-dfs的典型应用给定一个方阵,定义连通:上下左右相邻,并且值相同可以想象成一张地图,不同的区域被涂以不同颜色输入:整数N, (N<50)表示矩阵的行列数接下来N行,每行N个字符,代表方阵中的元素接下来一个整数M,(M<1000)表示询问数接下来M行,每行代表一个询问,格式为4个整数,y1,x1,y2,x2,表示询问(第y1行,第x1列...原创 2019-02-09 19:35:21 · 855 阅读 · 0 评论 -
关于递归的进一步的理解
1. 学习了关于深搜,二叉树,图论之后发现对于理解清楚递归来说是非常重要的,递归能够帮助我们干很多事情,而且在很多情况下只能使用递归来解决,比如涉及到不确定的情况下往往需要使用到递归,这也叫做深搜,尝试每一种的可能性,直到搜索完所有的路径之和,例如数独游戏就一定要使用到深搜才能够解决的,所以来说递归是非常重要的① 深搜一般的套路是在for循环中进行递归,我们需要清楚的是在for循环中递归是一层...原创 2019-02-09 22:38:25 · 263 阅读 · 0 评论 -
合根植物(深搜与并查集)
1. 问题描述:问题描述 w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。 如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?输入格式 第一行,两个整数m,n,用空格分开,表示格子的行数、...原创 2019-02-19 21:00:45 · 452 阅读 · 1 评论 -
kruskal算法(最小生成树)
1. kruskal:求加权连通图的最小生成树的算法在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树算法大体上的思路是根据给出的边集构成的连通图,能够选择其中的若干条生成一棵树,并且树的所有边的权重之和是最小的需要经过下面的步骤:① 根据给出的若干条边创建一个边集,因为需要选择权重最小的边那么需要...原创 2019-02-20 14:49:22 · 677 阅读 · 0 评论 -
图的表示概念
图的表示有多种方式,其中主要有以下三种方式:① 邻接矩阵(二维数组):可以用来表示无向图与有向图逻辑结构分为两部分:V和E集合。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵 ② 邻接表(节点存储了当前节点的邻居)邻接表,存储方法跟树的孩子链表示法相类似,是一种顺序分...原创 2019-02-20 15:35:21 · 528 阅读 · 0 评论 -
迷宫问题(广度优先搜索)
1. 问题描述:输入:第一行输入迷宫的行与列,第二行输入迷宫输出:走出迷宫的最少步数下面是具体的例子:...1111111111111111111111111111111.111111........1111111111.111111.111111..111.11111111.....111111.11111111111.1111111111.111111...原创 2019-03-04 07:51:32 · 1524 阅读 · 0 评论 -
吝啬的国度(建立双向联系 + 深度优先搜索)
1. 问题描述:描述在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。输入第一行输入一个整数M表示测试数据共有M(1<=M<=5)组每组测试数据的第一行输入一个正整数N(1<=N<=100000...原创 2019-03-14 10:36:37 · 474 阅读 · 0 评论 -
欧拉道路与欧拉回路
1. 相关的概念如下:① 有向图G为欧拉回路:当且仅当G的基图连通,且所有顶点的入度等于出度② 有向图G为欧拉路:当且仅当G的基图连通,而且只存在一个顶点u的入度比出度大于1,只存在一个顶点v的出度比入度大于1(即最多有两个点的入度不等于初度),而且只能从初度比入度大于1的顶点作为起点或者入度比出度大于1的顶点起点这样才可以把图中的所有路径走完③ 如果一个无向图是连通的,而且最多存在着...原创 2019-03-11 09:53:01 · 2183 阅读 · 0 评论 -
Bellman_flyod算法(单源最短路径)
1.Bellman_ford算法下面是百度百科对于算法的介绍:在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。 虽然它不返回路径本身的细节,但是可以通过对算法的简单修改来重建路径。 该算法的版本也可用于查找关系R的传递闭包,或(与Schulze投票系统相关)...原创 2019-03-07 21:37:50 · 551 阅读 · 0 评论 -
图的搜索标记方法
1. 在对图的深度优先搜索的过程我们一定要做的一件事情是对于访问过的节点进行标记,因为与树的深度优先搜索不同的是,在图的搜索中它有可能是回到原来已经搜索过的节点这样就会在永远地递归下去得不到结果而且还会导致堆栈溢出,所以需要对图中已经访问过的节点进行标记,这样在下一次深度优选搜索到之前的节点的时候发现之前已经被访问过那么久不会再进行相同节点的重复递归了2. 常用的标记方法有:① 使用Set...原创 2019-03-11 19:33:50 · 565 阅读 · 0 评论 -
使用集合数组创建邻接表
1. 对于无根树或者无向图的节点的深度优先搜索中,因为无向的,所以我们必须将有联系的节点进行双向的联通,而邻接表对于这种问题的解决就再适合不过了,下面是构建邻接表的过程2. 具体的步骤如下:① 创建一个集合数组,将与当前有联系的节点加入到集合数组中,集合数组中的每一个元素都是一个集合,而集合是可以动态将元素装进去的,所以可以满足我们的需求,数组的下标表示的是当前节点的序号② 怎么样进行...原创 2019-03-21 18:05:52 · 345 阅读 · 0 评论 -
数据结构中关于图以及相关算法的总结
1. 首先我们需要清楚的是有关图的相关概念,定义和相关术语,比如顶点的度、入度、初度、弧、有向完全图和无向完全图、路径和路径长度、简单路径、回路连通、连通图和连通分量、强连通图和强连通分量、权和网① 简单路径:序列中顶点不重复的路径称为简单路径② 连通图:如果图中任意两个顶点之间都连通那么称该图为连通图③ 无向图中的极大连通子图称为连通分量④ 强连通图:在有向图中如果对于每一对顶点...原创 2019-06-13 12:05:03 · 1219 阅读 · 0 评论 -
kruskal算法(最小生成树算法)
1. kruskal算法同样是解决无向图中最小生成树问题,与Prim算法不同的是,kruskal算法采用了边贪心的策略,其思想及其简洁,理解难度要比Prim算法要低很多,算法的基本思想如下:在初始状态的时候隐去图中所有的边,这样图中每个顶点都自成一个联通块,之后执行下面的步骤:① 对所有的边按照边权从小到大进行排序② 按照边权从小到大测试所有边,如果当前测试边所连接的两个顶点不在一个联...原创 2019-06-14 10:10:28 · 1726 阅读 · 0 评论 -
拓扑排序(邻接表存储图)
1. 拓扑排序是将有向图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u,v如果存在边u,v那么序列中u一定是在v的前面,这个序列有被称为是拓扑序列所以拓扑排序是针对于有向图的,是用来判定有向图中是否存在环(深度优先搜索也可以判定有向图是否有环)2. 拓扑排序的执行过程如下:① 定义一个队列,并把所有入度为0的节点加入到队列中去② 取出队首节点,输出,然后删除所有从它发出...原创 2019-06-14 11:42:32 · 2968 阅读 · 0 评论 -
图的深度优先搜索
1. 图的深度优先搜索是我们在学习对于图的遍历的一种很重要的方式,与树的深度优先搜索不同的是,图是有可能存在环路的,所以我们不能够直接像深度优先搜索树那样直接搜索,因为有环的时候会陷入一直递归下去的情况,所以需要增加一个标记符号,表示当前的顶点和边是已经被访问过的,下一次再遍历到这个已经被访问过的顶点或者是边的时候应该跳过,其余跟树的深度优先搜索是都是差不多的2. 下面是具体的过程① 使用...原创 2019-06-11 14:06:52 · 3353 阅读 · 0 评论 -
C++邻接表存储图的深度优先搜索
1. 在数据结构中对于图的存储主要有三种方式,分别为邻接矩阵,邻接表和边集,前两种比较常用,下面使用的是C++语言vector来实现邻接表并且实现深度优先搜索因为对于初学者来说,使用链表来实现邻接表的话过程比较复杂,不太容易理解,存在多个结构体之间的相互嵌套,所以我们在学习的时候可以使用简单一点的工具来实现邻接表2. 下面是具体的实现过程:① 由于vector变长数组之称,因此可以开一...原创 2019-06-21 10:56:45 · 1172 阅读 · 0 评论 -
分红酒(广度优先搜索)
1. 题目描述:有4个红酒瓶子,它们的容量分别是:9升, 7升, 4升, 2升 开始的状态是 [9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。 允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。这样的一次倒酒动作称为1次操作。 假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现? 本题就是要求你...原创 2019-02-21 13:40:48 · 336 阅读 · 0 评论