随笔分类 -  ACM / 最短路

摘要:原题链接 考察:最短路 思路: 建边是容易想到的...但是本蒟蒻没反应过来怎么求会面点... 建虚点,以1,n为起点求到达每个点的距离,然后每个点距离的最大值的最小值就是答案. ##Code #include <iostream> #include <cstring> #include <queue 阅读全文
posted @ 2021-06-23 23:12 acmloser 阅读(30) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:01分数规划+SPFA判环 思路: 和之前的最小环没什么区别,本题最难在建边.看题目很想当然的是二重for循环字符串建边,但是明显会TLE并且MLE, 考虑换一个思路, ababc + bckjaca -> aba bc kjaca 只考虑前面两个与结尾两个,就转化为 ab-> bc 阅读全文
posted @ 2021-05-07 00:59 acmloser 阅读(60) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:01分数规划+SPFA 思路: 基本是和观光奶牛一样的题,这题的边权化为 sgma(w[i]) - mid.然后判断是否存在负环. 但是会TLE 5个点,此时可以用玄学优化,如果已经转了5圈就说明存在负环. 1 #include <iostream> 2 #include <cstr 阅读全文
posted @ 2021-05-06 18:13 acmloser 阅读(40) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:二分+SPFA 引入:形如 ${\sum_1n f[i] \over \sum_1n g[j]}$求其最大值,称为01分数规划问题.通过二分最大值,检验解的存在性,这样的存在性具有单调性,所以可以用二分解决. 思路: 想到二分之后,我们可以假设最大值 = mid,对于每一个环,检验$ 阅读全文
posted @ 2021-05-06 01:12 acmloser 阅读(42) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:Floyd 思路: 每次0操作都是加入一个点,这个操作有点像Floyd,Floyd算法也是每次操作加入一个点,然后更新.但直接每次加入新点就Floyd会超时,所以要对Floyd算法优化. 每次加入一个新点,就直接更新与该点有关的边.但有个误区是不能只更新已加入点与新点直接的边.比如1 阅读全文
posted @ 2021-05-03 20:18 acmloser 阅读(39) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:floyd 思路: 很明显的传递闭包,但是我们直接敲板子上去会TLE.神级剪枝在floyd的第三重循环,如果g[i][k] = 0那么第三重循环没必要进行. 1 #include <iostream> 2 #include <cstring> 3 using namespace st 阅读全文
posted @ 2021-05-03 17:37 acmloser 阅读(51) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:Floyd+输出路径 错误思路: 跑一遍Floyd,记录使g[i][j]>g[i][k]+g[k][j]+w[k] 变小的k.分为[l,k] [k,r]输出路径. 当g[i][j] = g[i][k]+g[k][j]+w[k],比较path[i][j] 与当前枚举点k的大小. 错误原 阅读全文
posted @ 2021-05-03 17:07 acmloser 阅读(37) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:Floyd+矩阵快速幂 思路: 前面讲过Floyd算法的第一层循环是i~j的最短路,经过1~k的结点.在这里我们将Floyd的dp状态表示f[k,i,j]. 假设i经过a条边到达S, f[k,i,j] = f[a,i,S]+f[k-a,S,j] 我们可以发现前a条边的路径与后面的路径 阅读全文
posted @ 2021-05-03 09:12 acmloser 阅读(141) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:Floyd 思路: 考察Floyd算法应用之最小环.在应用Floyd之前我们先了解Floyd的本质. 1 for(int k=1;k<=n;k++)//起点到终点之间经过1~k点 2 for(int i=1;i<=n;i++)//枚举起点 3 for(int j=1;j<=n;j++ 阅读全文
posted @ 2021-05-02 22:52 acmloser 阅读(52) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:Floyd 思路: 传递闭包应用题.也可以用拓扑排序,这里先练下传递闭包.拓扑排序以后补 传递闭包模板: 1 for(int k=1;k<=n;k++) 2 for(int i=1;i<=n;i++) 3 for(int j=1;j<=n;j++) 4 if(g[i][k]&&g[k 阅读全文
posted @ 2021-05-02 11:25 acmloser 阅读(48) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路 思路: 较水,正反向建图求和. 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 typedef long long LL; 6 typedef pai 阅读全文
posted @ 2021-05-01 23:40 acmloser 阅读(41) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路+思维 完全不会,废物本废 错误思路: 比较明显的思路就是以每个特殊点为起点,然后Dijkstra,再以每个特殊点为终点求最小值,显而易见地TLE 解法一(官方题解): 由暴力思路延伸来的思路.因为我们只需要知道最小值,而不是特殊点.所以起点和终点是谁无所谓.所以可以将上述的一 阅读全文
posted @ 2021-05-01 22:41 acmloser 阅读(74) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路 思路: 拆点.只有一个状态不足以求出最小花费,需要再加上当前点用了几次免费机会. 坑点: 存在起点与终点经过路线<k的情况,这时候用不到k次机会,所以直接返回0的贪心是错的.... 1 #include <iostream> 2 #include <cstring> 3 #i 阅读全文
posted @ 2021-05-01 16:48 acmloser 阅读(57) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路 思路: 很容易看出t就是一般最短路的权值,快速地打了一遍dijkstra板子结果发现输出结果和样例不一样,那么答案错在哪里呢? 我们调试一下就可以发现,到达中间某点的耗时晚,不一定到达终点就晚,因为到达时间由到达每个点的时间和速度决定. 之前说过最短路可以和dp联系起来,那么 阅读全文
posted @ 2021-05-01 13:32 acmloser 阅读(111) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路+二分 思路: 二分最多的一次收取的费用的最小值,对于每一个二分值跑一遍最短路,最后判断n点是否可达即可.这里的check函数的思路类似二分经典题:搬石头 long long数组的极大值可以初始化为memset(数组,63,size) 1 #include <iostream> 阅读全文
posted @ 2021-05-01 11:40 acmloser 阅读(41) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路 思路: 是模板题.Johnson算法主要用于处理负权边,它可以让Dijkstra算法计算带负权的最短路问题. 具体的做法是:建立虚点0,再让0与每个点连一条边,求出0到每个点的最短路,将(u,v)之间的权值w = w+dist[u]-dist[v]. 这样w一定为正,因为最短 阅读全文
posted @ 2021-05-01 10:33 acmloser 阅读(56) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:floyd+枚举 相差了...想的是直径端点作为加的路左右端点之一...但实际是全部枚举. 思路: 暴力枚举所有没有连通的点,然后对于加的那条路,求左端点的最远距离+右端点的最远距离+加的路线的距离 最后再与剩下的直径求最小值. 1 #include <iostream> 2 #in 阅读全文
posted @ 2021-05-01 01:41 acmloser 阅读(55) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路+dp md最短路计数变个形我就不会了,我是fw 思路: 首先明确当前u点的次短路 = u的最短路+road[i].w 或 u的次短路 +road[i].w .这道题实际不需要先求一遍最短路,然后再求一遍次短路及其条数.像求树的直径一样,次短路和最短路可以一次性求完. 只需要像 阅读全文
posted @ 2021-04-30 17:10 acmloser 阅读(48) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:双端队列+BFS+拆点 错误思路: 一开始想的是普通的BFS,但是用st数组记录有了哪些钥匙,但本蒟蒻脑子短路将st数组定义成全局变量.实际上是每一个点定义一个数存储该点有哪些钥匙.然后存储边想的是mp[x][y][i]表示x,y的i方向需要第几把钥匙.题解有类似写法,这种写法就是普 阅读全文
posted @ 2021-04-29 19:11 acmloser 阅读(70) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最短路 思路: 类似多源BFS,建立超级源点S,该源点到达所有起点的距离为0.求超级源点到达终点的最短距离. 这题可以扩展到多起点多终点问题,都是建立超级源点S求解 1 #include <iostream> 2 #include <cstring> 3 #include <vect 阅读全文
posted @ 2021-04-28 22:45 acmloser 阅读(101) 评论(0) 推荐(0) 编辑