
Graph Algorithm
文章平均质量分 62
图算法
阿飞算法
这个作者很懒,什么都没留下…
展开
-
[LeetCode]1368. 使网格图至少有一条有效路径的最小代价
题目1368. 使网格图至少有一条有效路径的最小代价1368. 使网格图至少有一条有效路径的最小代价给你一个 m x n 的网格图 grid 。 grid 中每个格子都有一个数字,对应着从该格子出发下一步走的方向。 grid[i][j] 中的数字可能为以下几种情况:1 ,下一步往右走,也就是你会从 grid[i][j] 走到 grid[i][j + 1]2 ,下一步往左走,也就是你会从 grid[i][j] 走到 grid[i][j - 1]3 ,下一步往下走,也就是你会从 grid[i][j原创 2022-05-29 20:34:53 · 261 阅读 · 0 评论 -
[LeetCode]6081. 到达角落需要移除障碍物的最小数目
题目6081. 到达角落需要移除障碍物的最小数目6081. 到达角落需要移除障碍物的最小数目给你一个下标从 0 开始的二维整数数组 grid ,数组大小为 m x n 。每个单元格都是两个值之一:0 表示一个 空 单元格,1 表示一个可以移除的 障碍物 。你可以向上、下、左、右移动,从一个空单元格移动到另一个空单元格。现在你需要从左上角 (0, 0) 移动到右下角 (m - 1, n - 1) ,返回需要移除的障碍物的 最小 数目。 示例 1:输入:grid = [[0,1原创 2022-05-29 20:28:26 · 477 阅读 · 0 评论 -
在一个有向图中找环-PART2
在一个有向图中找环-PART2CycleInDirectedGraphimport java.util.HashSet;import java.util.Set;public class CycleInDirectedGraph { public boolean hasCycle(Graph<Integer> graph) { Set<Vertex<Integer>> whiteSet = new HashSet<>()原创 2021-09-26 09:07:35 · 236 阅读 · 0 评论 -
有向无环图的所有拓扑排序
有向无环图的所有拓扑排序对有向无环图DAG的拓扑排序是顶点的线性排序,从而使每一有向边[u,v][u,v][u,v],顶点u进来的顺序v在。如果图不是 DAG,则无法对图进行拓扑排序。给定一个 DAG,打印图的所有拓扑排序。All topological sorts of the given graph are:4 5 0 2 3 1 4 5 2 0 3 1 4 5 2 3 0 1 4 5 2 3 1 0 5 2 3 4 0 1 5 2 3 4 1 0 5 2 4 0 3 1 5 2原创 2021-08-09 11:03:07 · 1856 阅读 · 0 评论 -
一文掌握Kruskal算法
一文掌握Kruskal算法Union-Find class UnionFind { int[] parents; int[] ranks; public UnionFind(int n) { parents = new int[n]; ranks = new int[n]; for (int i = 0; i < n; i++) { par原创 2021-08-09 10:32:16 · 187 阅读 · 0 评论 -
一文掌握Bellman-Ford算法
一文掌握Bellman-Ford算法方法1:朴素版Bellman-Ford算法思想Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题。对于给定的带权(有向或无向)图 G=(V,E),其源点为s,加权函数 w是 边集 E 的映射。对图G运行Bellman-Ford算法的结果是一个布尔值,表明图中是否存在着一个从源点s可达的负权回路。若不存在这样的回路,算法将给出从源点s到 图G的任意顶点v的最短路径d[v]。Bellman-Ford算法流程分为三个阶段:(1) 初原创 2021-08-09 10:31:12 · 1388 阅读 · 0 评论 -
一文掌握SPFA算法
一文掌握SPFA算法何为SPFA(Shortest Path Faster Algorithm)算法:**给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求含负权图的单源最短路径,且效率较高。(**spfa是求单源最短路径的一种算法,它还有一个重要的功能是判负环(在差分约束系统中会得以体现),在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作,是一种高效的最短路算法。)**spfa算法思想:**spfa就是BellmanFo原创 2021-08-09 10:30:25 · 284 阅读 · 0 评论 -
一文掌握Prim算法
一文掌握Prim算法思路PrimPrimPrim 算法是依据顶点来生成的,它的每一步都会为一颗生长中的树添加一条边,一开始这棵树只有一个顶点,然后会添加 N−1N - 1N−1 条边,每次都是将下一条连接树中的顶点与不在树中的顶点且权重最小的边加入到树中。算法流程:记录每个顶点到其他顶点的权重;设计一个boolean[]boolean[]boolean[],判断是否被读取过;每次读取堆顶元素,如果曾经被读取过就不再读取,否则把其所有边加入堆; static class Pair {原创 2021-08-09 10:29:46 · 262 阅读 · 0 评论 -
有向无环图中的最长路径-PART1
有向无环图中的最长路径-PART1给定一个加权有向无环图DAG和一个源点s在它,找到从s中最长的距离在给定图中的所有其他顶点一般图的最长路径问题不像最短路径问题那么容易,因为最长路径问题不具有最优子结构属性。事实上,最长路径问题对于一般的图来说是NP-Hard问题。然而,对于有向无环图的最长路径问题,其具有线性时间解。这个想法类似于有向无环图中最短路径的线性时间解决方案,我们使用拓扑排序。我们将到所有顶点的距离初始化为负无穷大,到源点的距离初始化为 0,然后我们找到图的拓扑排序。图的拓扑排序表示图原创 2021-08-09 10:14:40 · 3053 阅读 · 1 评论 -
一文掌握Hierholzer算法
Hierholzer算法的精髓是当每次访问一条边的时候,删除这条边,当遍历完一个节点所连的所有节点后,才将该节点入栈,最后将栈中的节点反转,即可得到欧拉路径 public void printCircuit(List<List<Integer>> adj) { //edgeCount记录记录有向图的边的条数,从当前节点v出发 Map<Integer, Integer> edgeCount = new HashMap<&g.原创 2021-02-08 21:28:56 · 1624 阅读 · 0 评论 -
一文掌握Fleury算法
一些概念:割点在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合,如果某个割点集合只含有一个顶点 X(也即{X}是一个割点集合),那么X称为一个割点割边在一个无向图中,如果有一个边集合,删除这个边集合以后,图的连通分量增多,就称这个边集为割边集合,如果某个割边集合只含有一条边 X(也即{X}是一个边集合),那么X称为一个割边,也叫做桥步骤1.如果要找欧拉回路,可以从任意点开始,如果要找欧拉路径,需要从有着奇数度的原创 2021-02-09 09:14:57 · 3777 阅读 · 1 评论 -
一文掌握Floyd算法
一文掌握Floyd算法结构体typedef struct struct_graph{ char vexs[MAXN]; int vexnum;//顶点数 int edgnum;//边数 int matirx[MAXN][MAXN];//邻接矩阵 } Graph;伪代码//这里是弗洛伊德算法的核心部分 //k为中间点 for(k = 0; k < G.vexnum; k++){ //v为起点 for(v原创 2021-08-09 09:20:52 · 170 阅读 · 0 评论 -
一文掌握Dijkstra算法
一文掌握Dijkstra算法迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。基本思想通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。初始时,S中只有起点s;U中是除s之外的顶点,并原创 2021-08-08 18:03:28 · 252 阅读 · 0 评论 -
畅游图论之判断二分图
畅游图论之判断二分图方法1:BFSpublic boolean isBipartite(int[][] graph) { int V = graph.length; int[] colors = new int[V]; Arrays.fill(colors, -1);//-1表示未着色 Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i < V; i++) {原创 2021-08-08 17:48:34 · 187 阅读 · 0 评论 -
图着色PART1-介绍与应用
图着色PART1-介绍与应用介绍图着色Graph Coloring问题是将颜色分配给受某些约束的图的某些元素顶点着色Vertex Coloring是最常见的图着色问题。一个经典问题:给定 m 种颜色,找到一种为图的顶点着色的方法,使得没有两个相邻顶点使用相同的颜色着色。其他图形着色问题,如边着色Edge Coloring(没有顶点与相同颜色的两条边关联)和面着色Face Coloring(地理地图着色)可以转化为顶点着色Vertex Coloring问题。**色数:**为图形 G原创 2021-08-08 11:28:58 · 1797 阅读 · 0 评论 -
查找有向图中两个顶点之间是否存在路径
查找有向图中两个顶点之间是否存在路径给定一个有向图和其中的两个顶点,检查是否存在从第一个给定顶点到第二个顶点的路径。Consider the following Graph:Input : (u, v) = (1, 3)Output: YesExplanation: There is a path from 1 to 3, 1 -> 2 -> 3Input : (u, v) = (3, 0)Output: NoExplanation: There is no path原创 2021-08-08 10:25:27 · 3778 阅读 · 0 评论 -
判断一个图是否是树
判断一个图是否是树Alogrithm:如果无向图具有以下性质,则它是树。没有环图是连通的对于无向图,我们可以使用BFS或DFS来检测以上两个性质:如何检测无向图中的环?我们可以使用 BFS 或 DFS。对于每个访问过的顶点 ‘v’,如果有一个相邻的 ‘u’ 使得 u 已经被访问过并且 u 不是 v 的父节点,那么图中存在一个环。如果没有为任何顶点找到这样的相邻点,我们就说没有环,参考在一个无向图中找环。如何检查连通性?由于图是无向图,我们可以从任何顶点开始BFS或DF原创 2021-08-08 08:55:04 · 5181 阅读 · 0 评论 -
判断一个图是否是二分图
判断一个图是否是二分图二分图:其顶点可分为两组独立的U和V,使得每条边[u,v][u,v][u,v]可以连接顶点,从UUU到V,或者从V到UUU,换言之,对于每一个边[u,v][u,v][u,v],要么u属于U,v属于V,要么u属于V,v属于U。我们也可以说没有一条边连接同一个集合的顶点如果可以使用两种颜色对图进行着色,使得集合中的顶点用相同的颜色着色,则二分图是可能的。请注意,可以使用两种颜色为具有偶数个顶点的环着色。Alogrithm:检查图是否为二分图的算法:一种方法是使用回溯算法处原创 2021-08-07 18:29:50 · 4266 阅读 · 0 评论 -
有向无环图的最短路径
有向无环图的最短路径给定一个加权有向无环图和图中的一个源顶点,找到从给定源到所有其他顶点的最短路径。对于一般的加权图,我们可以使用Bellman-Ford 算法在 O(VE)O(VE)O(VE) 时间内计算单源最短距离。对于没有负权重的图,我们可以做得更好,并使用Dijkstra 算法在 O(E+VLogV)O(E + VLogV)O(E+VLogV) 时间内计算单源最短距离。我们可以为有向无环图DAG 做得更好吗?我们可以在O(V+E)O(V+E)O(V+E)时间内计算 DAG 的单原创 2021-08-07 17:51:48 · 1883 阅读 · 0 评论 -
有向无环图的拓扑排序
有向无环图的拓扑排序有向无环图 (DAG) 的拓扑排序是顶点的线性排序,使得对于每个有向边 u, v,顶点 u排在 v 之前。如果图不是 DAG,则无法对图进行拓扑排序。例如,下图的拓扑排序是「5 4 2 3 1 0」。一个图可以有多个拓扑排序。例如,下图的另一种拓扑排序是「4 5 2 3 1 0」。拓扑排序中的第一个顶点始终是入度为 0 的顶点(没有传入边的顶点)。拓扑排序与深度优先遍历(DFS):在DFS,我们打印一个顶点,然后对其相邻顶点递归调用 DFS。在拓扑排序中,我们需原创 2021-08-07 14:05:29 · 6637 阅读 · 0 评论 -
一文掌握并查集算法
欢迎阅读、点赞、转发、订阅,你的举手之间,我的动力源泉。{:width=“400px”}定义并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(.原创 2021-08-06 09:56:49 · 329 阅读 · 0 评论 -
包含路径秩和压缩的并查集算法
在之前的文章中,讨论了并查集的朴素版本// Naive implementation of findstatic int find(int parent[], int i){ if (parent[i] == -1) return i; return find(parent, parent[i]);} // Naive implementation of union()static void Union(int parent[], int x, int y)原创 2021-08-07 13:32:59 · 124 阅读 · 0 评论 -
无权图的最短路径
无权图的最短路径Approach:一种解决方案是使用Bellman-Ford算法在 O(VE) 时间内求解。如果没有负权重环的话,那么可以使用Dijkstra 算法在 O(E + VLogV) 时间内求解。由于图是无权的,可以在 O(V + E) 时间内解决这个问题。这个想法是使用广度优先搜索的修改版本,其中我们在进行广度优先搜索时继续存储给定顶点的predecessor。即使图中存在负权重环,该算法也可以完成。我们首先初始化一个数组 dist[0, 1, …, v-1] ,使得 dist[i原创 2021-08-07 06:39:38 · 1527 阅读 · 0 评论 -
在一个无向图中找环
在一个无向图中找环PART1:DFSApproach:从每个未访问的节点运行 DFS。深度优先遍历可用于检测图中的循环。连通图的 DFS 生成一棵树。仅当图中存在回边Back Edge:从一个顶点指向其祖先顶点的边时,图中才存在环。回边Back Edge是将节点连接到自身(自循环)或其在 DFS 生成的树中的祖先之一的边。要找到其任何祖先的回边Back Edge,保留一个访问过的数组,如果任何访问过的节点都有回边Back Edge,则存在一个循环并返回 true。Algorithm:使用给定原创 2021-08-06 09:03:32 · 6131 阅读 · 0 评论 -
图论之经典算法
//tod原创 2021-08-06 07:54:21 · 188 阅读 · 0 评论 -
图论之基础算法
//tod原创 2021-08-06 07:52:01 · 153 阅读 · 0 评论 -
在一个有向图中找环
在一个有向图中找环有向图中边的分类树边(Tree Edge):从一个顶点指向其未访问过的子节点的边。前向边(Forward Edge):从一个顶点指向该顶点的一个非子顶点后裔的边,且接受点被访问过。回边(Back Edge):从一个顶点指向其祖先顶点的边。横跨边(Cross Edge):从一个顶点指向一个已完全访问过的顶点,且其中接受点既不是发起点的的后裔,也不是其祖先。小规律:树边、前向边,都是往前指,即顺着bfs遍历的顺序;回边是往回指,即逆着bfs遍历的顺序;横跨边横着指,即边的两个原创 2021-08-05 20:15:20 · 5178 阅读 · 0 评论