随笔分类 - ACM
大二到大三不堪回首的记忆....
摘要:原题链接 考察:最(次)小生成树 思路: 很明显是求解严格次小生成树. 在当前图所有能构造树的方法中,边权和是第二大的生成树. 求次小生成树的两种方法: 1.先求最小生成树,枚举删取最小生成树的一条边,然后再做最小生成树 时间复杂度O(mlog2 m+nm) 但只能求非严格次小生成树 2.先求最小生
阅读全文
摘要:原题链接 考察:最小生成树 思路: 本题要求完成图的最小生成树依旧是原树.考虑Kruskal算法,每次都是选择当前边两端合并为一个集合,我们要保证为完全图的话需要让左右端点的集合两两之间连一条边,同时保证原树的边是当前集合最小的边.因为原边不能代替所以考虑取road[i].w+1的边,边的数量是左端
阅读全文
摘要:原题链接 考察:最小生成树 思路: 一眼扫过去超像Prim算法,实际上最小生成树的两种方法皆可.当我们刚开始建矿井时就像有个虚拟源点向实点伸展了一条边,所以建立个虚拟原点即可. 这道题是无向边所以不用管u,v到底哪个是被建矿井的端点. 1 #include <iostream> 2 #include
阅读全文
摘要:原题链接 考察:Floyd 思路: 每次0操作都是加入一个点,这个操作有点像Floyd,Floyd算法也是每次操作加入一个点,然后更新.但直接每次加入新点就Floyd会超时,所以要对Floyd算法优化. 每次加入一个新点,就直接更新与该点有关的边.但有个误区是不能只更新已加入点与新点直接的边.比如1
阅读全文
摘要:原题链接 考察:floyd 思路: 很明显的传递闭包,但是我们直接敲板子上去会TLE.神级剪枝在floyd的第三重循环,如果g[i][k] = 0那么第三重循环没必要进行. 1 #include <iostream> 2 #include <cstring> 3 using namespace st
阅读全文
摘要:原题链接 考察: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的大小. 错误原
阅读全文
摘要:原题链接 考察: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条边的路径与后面的路径
阅读全文
摘要:原题链接 考察: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++
阅读全文
摘要:原题链接 考察: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
阅读全文
摘要:原题链接 考察:最短路 思路: 较水,正反向建图求和. 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 typedef long long LL; 6 typedef pai
阅读全文
摘要:原题链接 考察:最短路+思维 完全不会,废物本废 错误思路: 比较明显的思路就是以每个特殊点为起点,然后Dijkstra,再以每个特殊点为终点求最小值,显而易见地TLE 解法一(官方题解): 由暴力思路延伸来的思路.因为我们只需要知道最小值,而不是特殊点.所以起点和终点是谁无所谓.所以可以将上述的一
阅读全文
摘要:原题链接 考察:最短路 思路: 拆点.只有一个状态不足以求出最小花费,需要再加上当前点用了几次免费机会. 坑点: 存在起点与终点经过路线<k的情况,这时候用不到k次机会,所以直接返回0的贪心是错的.... 1 #include <iostream> 2 #include <cstring> 3 #i
阅读全文
摘要:原题链接 考察:最短路 思路: 很容易看出t就是一般最短路的权值,快速地打了一遍dijkstra板子结果发现输出结果和样例不一样,那么答案错在哪里呢? 我们调试一下就可以发现,到达中间某点的耗时晚,不一定到达终点就晚,因为到达时间由到达每个点的时间和速度决定. 之前说过最短路可以和dp联系起来,那么
阅读全文
摘要:原题链接 考察:最短路+二分 思路: 二分最多的一次收取的费用的最小值,对于每一个二分值跑一遍最短路,最后判断n点是否可达即可.这里的check函数的思路类似二分经典题:搬石头 long long数组的极大值可以初始化为memset(数组,63,size) 1 #include <iostream>
阅读全文
摘要:原题链接 考察:最短路 思路: 是模板题.Johnson算法主要用于处理负权边,它可以让Dijkstra算法计算带负权的最短路问题. 具体的做法是:建立虚点0,再让0与每个点连一条边,求出0到每个点的最短路,将(u,v)之间的权值w = w+dist[u]-dist[v]. 这样w一定为正,因为最短
阅读全文
摘要:原题链接 考察:floyd+枚举 相差了...想的是直径端点作为加的路左右端点之一...但实际是全部枚举. 思路: 暴力枚举所有没有连通的点,然后对于加的那条路,求左端点的最远距离+右端点的最远距离+加的路线的距离 最后再与剩下的直径求最小值. 1 #include <iostream> 2 #in
阅读全文
摘要:原题链接 考察:最短路+dp md最短路计数变个形我就不会了,我是fw 思路: 首先明确当前u点的次短路 = u的最短路+road[i].w 或 u的次短路 +road[i].w .这道题实际不需要先求一遍最短路,然后再求一遍次短路及其条数.像求树的直径一样,次短路和最短路可以一次性求完. 只需要像
阅读全文
摘要:原题链接 考察:双端队列+BFS+拆点 错误思路: 一开始想的是普通的BFS,但是用st数组记录有了哪些钥匙,但本蒟蒻脑子短路将st数组定义成全局变量.实际上是每一个点定义一个数存储该点有哪些钥匙.然后存储边想的是mp[x][y][i]表示x,y的i方向需要第几把钥匙.题解有类似写法,这种写法就是普
阅读全文
摘要:原题链接 考察:最短路 思路: 类似多源BFS,建立超级源点S,该源点到达所有起点的距离为0.求超级源点到达终点的最短距离. 这题可以扩展到多起点多终点问题,都是建立超级源点S求解 1 #include <iostream> 2 #include <cstring> 3 #include <vect
阅读全文
摘要:原题链接 考察:最短路+dp 写这道题的时候脑子很乱...没想多久就看了题解...忏悔 写题效率真的太低了... 引入: dp是基于拓扑序的图论最短(最小值)或最长(最大值)的问题.dp的每一个状态都能推导它后面的一个状态,这种有顺序的遍历就是拓扑序.但是对于不是拓扑序的dp问题应该如何求解? 思路
阅读全文

浙公网安备 33010602011771号