
【图论】
无
不牌不改
※ 接受自己很普通
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
L3-018 森森美图 (30 分)
题目 题目链接 题解 BFS。 先看看样例咋出来的吧。 判断某个坐标属于起点终点连线的哪一侧的时候,我们采用是将点代入起点终点的两点式中根据正负值判断,两次bfs更新起点到终点的“距离”。 bfs每次扩展一个点,用起点到该点的“距离”更新其八个方向上的点的“距离”,如果八个方向上的点保存的“距离”被更新了,则入队,可以用这些点继续更新别的点,否则不要入队了,因为别的点已经由这些点更新过了,再加入个没变的“距离”还是不会有任何效果的,所以直接不入队,节约时间。 坑点: 注意不要重复统计起点和终点。(这个原创 2022-04-19 20:41:08 · 1262 阅读 · 0 评论 -
L3-014 周游世界 (30 分)
题目 题目链接 题解 DFS。 采用的数据结构,vector,索引为起点,值为{终点,起点公司编号},当然你也可以保存终点公司编号,但是代码中的语句就需要改一下了。 dfs,传入四个信息,当前节点、遇到的节点数、换乘数、当前节点所在公司的编号。 由于存在循环,要加入标记数组进行标记。 不敢dfs啊,而且也没想好用什么数据结构,看了大佬的题解才知道如何保存路径,才知道要用dfs,不过好歹最后自己写出来(算是)。 代码 #include<bits/stdc++.h> #define PII pa原创 2022-04-19 16:44:03 · 728 阅读 · 0 评论 -
L3-007 天梯地图 (30 分)
题目 题解 两次Dijkstra,分别计算最短距离和最短时间。 需要额外开辟数组来保存节点数量信息和路径信息。 路径信息一般都是更新每个节点的父亲节点,最后递归输出。我这里是先递归保存到vector中,因为通过vector可以直接判等,从而实现分开两种输出情况。 测试点1应该输出距离和时间序列相同的情况; 测试点2比较容易卡,建议是算完最短距离后,在计算最短时间时重新更新最短距离和最少节点数,而不是使用计算最短距离后得到的信息。 代码比较乱。 代码 #include<bits/stdc++.h&g原创 2022-04-19 11:59:07 · 495 阅读 · 0 评论 -
L3-005 垃圾箱分布 (30 分)
题目 题目链接 题解 对每个垃圾箱进行一次队列优化的Dijskra,每算出一个垃圾箱到其余各个居民点的最短距离后,计算这些距离中的最大距离、最短距离。如果最大距离大于要求的距离则直接忽略这个位置放垃圾桶的情况;否则,如果最短距离小于已经记录的最大的最短距离或者最短距离等于已经记录的最大的最短距离并且距离均值小于已经记录的最小均值,则更新要输出的信息。 优先级: 最短距离要最大 距离均值要最小 垃圾桶编号要小(由于我们是顺序判断每种情况,所以不需要通过该条件进行更新) 注意: 直接printf("%.1原创 2022-04-19 09:45:15 · 438 阅读 · 0 评论 -
L2-001 紧急救援 (25 分)
题目 题目链接 题解 最短路(扩展) 算是朴素Dijkstra模板吧。 Dijkstra算法 额外加上记录路径、记录到达此处的最短距离、记录以最短距离到达此处的最多人数。 更新方式: 假设未确定距离的点集中的点t距离已确定距离的点集最近,以t对其他未确定距离的点j进行松弛。即: 如果从s到j经过t的距离比不经过t短,则说明经过t更好,那么更新j的前一个节点为t,更新到达j的最大人数为到达t的最大人数+节点j的人数,更新到达j且距离最小的路径个数为到达t的路径个数; 如果从s到j经过t的距离与不经过t一原创 2022-03-21 12:05:48 · 1070 阅读 · 0 评论 -
2017蓝桥杯C/C++B组国赛-发现环
题目 题目链接 题解 并查集 + 最近公共祖先。 整体思路: 并查集用于判断是否出现环,出现环就记录下来导致环的边两端的点,求两个点的最近公共祖先,从两个端点向上找到全部的祖先直到二者的最近公共祖先,排序输出。 思路太清晰了,就是看你有没有背过模板。 (看到这个题秒出思路,但是忘记怎么写LCA了,看了看yxc,直接一发入魂) 代码 #include<bits/stdc++.h> using namespace std; const int N = 1e5+10; int idx, e[N原创 2022-03-16 10:59:08 · 1047 阅读 · 0 评论 -
HDU-2063过山车
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2063 解题思路 匈牙利算法,二分图模板 代码 #include<bits/stdc++.h> using namespace std; const int N = 1e3+10; int vis[N], e[N][N], p[N]; int k, m, n; bool find(int x) { for(int i = 1;i <= n;i ++) { if(e[x][i] &am原创 2021-06-08 20:19:40 · 212 阅读 · 0 评论 -
最近公共祖先模板
倍增法 题目链接 #include<bits/stdc++.h> using namespace std; const int N = 5e5 + 10; int idx, e[N<<1], ne[N<<1], h[N]; int dp[N], fa[N][30]; int n, m, s; void add (int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx ++; } void bfs () {原创 2022-03-16 10:00:33 · 220 阅读 · 0 评论 -
最短路算法总结
Dijsktra 模板 Bellman_ford 模板 SPFA 模板 Floyd 模板原创 2022-03-15 22:38:53 · 237 阅读 · 0 评论 -
Floyd 算法模板
题目链接 基于动态规划的原理,f[k][i][j]表示通过前k个点从i到j的距离,转移方程f[k][i][j] = f[k-1][i][k] + f[k-1][k][j],含义为用通过前k-1个点从i到达k的距离与通过前k-1个点从k到达j的距离 之和更新从前k个点从i到j的距离。 第一维度可以忽略。 #include<bits/stdc++.h> using namespace std; const int N = 100; int n, e[N][N]; int main() { ci原创 2022-03-15 22:15:08 · 327 阅读 · 0 评论 -
SPFA 算法模板
题目链接 SPFA 一般时间复杂度为 O(n)O(n)O(n),最坏情况下为 O(nm)O(nm)O(nm),本质是对 Bellman_ford 算法的优化。可以用于计算正、负边权的最短路,但不能取代 Bellman_ford 计算有步数限制的最短路。 思想: 在Bellman_ford算法中需要遍历全部的边来更新最短路,但是 d[b] = min (d[b], d[a] + w) 只有在 d[a] 被更新(变小),d[b]才有可能变小,所以我们试图将变小的d[b]对应的b记录下来,只用这些点去更新最短路。原创 2022-03-15 20:57:13 · 615 阅读 · 0 评论 -
Bellman_ford算法解决负边权与有边数限制的最短路问题模板
题目链接 #include<bits/stdc++.h> using namespace std; const int N = 510, M = 10010, INF = 0x3f3f3f3f; int n, m, k; int d[N], backup[N]; struct edge { int a, b, w; } e[M]; void bellman_ford () { memset (d, 0x3f, sizeof d); // 注意初始化 d[1] = 0;原创 2022-03-15 20:28:59 · 321 阅读 · 0 评论 -
判断是否为拓扑图、求拓扑序列模板
拓扑图的有关知识: 广搜的应用 针对有向图来说,无向图没有拓扑序列 有向无环图一定存在拓扑序列(有向无环图也被称作拓扑图) 入度和出度 入度为0的点作为拓扑序的起点 一个图的拓扑序不一定唯一 过程: 将入度为0的点入队 while(队列不空) { 取出队头t 枚举队头t的所有出边(出边为t -> j) t的入度--(删除t -> j) 判断t的入度是否为0,若为0则将t加入队列 } 代码 #include <bits/stdc++.h> using namespa原创 2022-03-14 20:56:50 · 1043 阅读 · 0 评论 -
Dijkstra 算法(非负边权单源最短路算法)模板
#include<bits/stdc++.h> #define PII pair <int, int> #define x first #define y second using namespace std; const int N = 1e5+10; priority_queue <PII, vector <PII>, greater <PII> > q; // 小根堆 int idx, w[N<<1], e[N<<原创 2022-03-13 17:42:57 · 669 阅读 · 0 评论 -
第十届蓝桥杯省赛C++B组-作物杂交
题目 题目链接 题解 Dijkstra算法应用。(感觉好难,但是能看出来是用Dijkstra) 这道题要将每类种子视为一个节点,如果两类种子可以杂交,那么在两类种子上连边,将两类种子杂交生成的新种子的类别和新种子生成所需时间打包成一个pair视为边权,d[i]表示由初始状态(即初始拥有若干类别的种子)到获取第i类种子所需要的时间,最后答案输出的就是d[T]。 最开始拥有的种子对应的d都是0,表示经过0时间就可以获取到这些类别的种子,也就是初始状态。 同时我们还需要开辟一个have数组,have[i]表示原创 2022-03-13 16:57:39 · 800 阅读 · 0 评论