图
abant2
世界上最菜的arcem
展开
-
leetcode 2203 单源最短路中转
此题看题意还是挺难的,但我们可以想象一下最终获得的子图是个什么形状:一定是图中有任意一个节点,两个出发点先到这个点汇合,再去终点。所以,我们通过dijkstra算法求三个点的单源最短路,其中终点的最短路需要存反的邻接表。然后枚举每个中转点即可。注意:dijkstra有几个优化点,一个是用两层vector实现邻接表,用map会慢。还有就是用-1初始dis表会好一些,如果用大数还需要考虑溢出,而且初始化较慢。typedef long long ll;typedef pair<ll, int>.原创 2022-03-19 16:20:42 · 213 阅读 · 0 评论 -
leetcode 743 单源最短路算法 bellman-ford, dijkstra
此题要求单源最短路,最简单但是较慢的算法,利用动态规划求解。bellman-ford:动态规划最短路首先理解一个概念:n个节点构成的图,最短路最长是n-1条边构成,这个比较直观,如果多了一定走了弯路我们每次选取一个边,更新源节点到边终点的距离,dis[to]=min(dis[to],dis[from]+pow)dis[to] = min(dis[to], dis[from] + pow)dis[to]=min(dis[to],dis[from]+pow)我们管这一步叫做松弛操作,所有边松弛一次,代表.原创 2022-03-18 22:06:33 · 585 阅读 · 0 评论 -
leetcode 1786 dijkstra + 记忆化搜索
这题还是有点意思的,算是个杂交题。先用dijkstra求出题目要求的单源最短路径,再用记忆化搜索优化dfs。这里dfs是可以用记忆化搜索优化的,将dfs的每一个状态含有的解计算好后放入dp数组,这样下次再遇到这个状态就可以直接返回。from heapq import *from collections import defaultdictclass Solution(object): def countRestrictedPaths(self, n, edges): """原创 2021-03-07 18:41:05 · 160 阅读 · 1 评论 -
leetcode 399 除法求值 floyd或带权并查集
此题先给你一个图,然后让你输出针对这个图的查询,是一个在线问题。floyd解决这个在线问题还是挺合适,也挺容易的,带权并查集也可以,但其实没什么必要。下面是基于乘法的floyd算法:class Solution {public: vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<ve.原创 2021-09-14 23:14:35 · 127 阅读 · 0 评论 -
有向图找环 拓扑排序
找环有几个问题,首先,是否要求找到所有的环?这个有点难,如果是完全图,那环太多了,只能暴力。所以,此题仅限于找一个环。平常加dp的话,用队列做还是很方便的,但是找环dfs是很在行的,此题用dfs记录路径即可。只需对原始的拓扑排序做一些修改即可。class Solution {map<int, vector<int>> v;public: int dfs(vector<int>& F, vector<int>&path, int原创 2021-07-03 20:33:00 · 539 阅读 · 0 评论 -
最大团问题 Bron-Kerbosch算法
最大团即最大完全子图问题。正常的做法是,先从一个小集合开始,如果一个新点和这个集合每个元素都有一条边,那么这个新点就可以加到团中。Bron-Kerbosch算法的特点是,无需显示判断新点是否和原来的集合有边。R集合即为集合,P集合为搜索范围,由伪代码可见,每个点的邻居都要用交集处理。这样,只有所有人都有的邻居才能加入集合。X集合为不处理的点,如果不处理的点也是所有人的朋友,那就不是最大团(加入新点就不是团)。所以,此算法可以找到所有的最大团,很强。...原创 2021-05-09 20:25:42 · 2127 阅读 · 0 评论