随笔分类 - OI
摘要:题意:给定一有M个点的环,有N个人绕着环走,每个人i从si开始,每次走pi个点,一共走ti次,求最少需要多少个点使得所有人都不会相遇 题解: 暴力枚举山洞的数量,检查就可以了。 i,j(j>i)能相遇,则(k*p[i]+c[i])%m=(k*p[j]+c[j])%m且k<=(l[i],l[j])。调
阅读全文
摘要:题意:给定一张图,求大于最小生成树上最长边的a[i]个数 题解: 跑Kruscal,看有几个猴子跳的距离比最小生成树上的最长边要远。 至于为什么,可以证明,如果不是最小生成树,那么一定存在一个边比最小生成树上的最大边要长。(有兴趣可以看一下次小生成树) #include <cmath> #inclu
阅读全文
摘要:题意:(没图不好说……) 题解:估价函数为当前状态与目标状态不同的格子数的数量-1 #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <climits> #include <iostre
阅读全文
摘要:题意:给定一个N*M的网格,有些格为特殊格:1、可以传送到同一列的某一格 2、可以传送到同一行的某一格 3、可以传送到周围八个格的某一格。可以任意选择开始的格,结束的格不限定,除了特殊格外其他格均不与其他格相连,求可以经过的最多不同格子数。 题解:每个门向其他可以到达的有门的房间连边,然后缩点,拓扑
阅读全文
摘要:题意:给定一无向图,选择最少的点,使得删除任意一个点后,其他的点都与所选择的点中任意一个联通 题解: 由于割点上肯定不能放井,所以开始时删除所有的割点。然后找出所有的双连通分量,如果双连通分量上有两个及以上割点,不用放井;如果只有一个割点,一定要放一个井,然后乘法原理统计答案即可。 至于怎么求双连通
阅读全文
摘要:题意:求图中割点的数量,割点是指无向图中的一个点,满足删除与该点所连的边后原图中曾经相通的点不再连通。 题解:回忆Tarjan求SCC的过程,如果某个点u的某个儿子v及其子树中的所有点的low均大于等于dfn[u](即low[v]<=dfn[u]),那么v子树上的点只能通过u来到达其他节点,因此u是
阅读全文
摘要:题意:求一张图的最长链 题解:Tarjan缩点,拓扑排序求最长链,每个点的权值为该点在原图中所包含的点的数量。注意重构图后会有重边影响方案数。 #include <stack> #include <queue> #include <cstdio> #include <cstring> #includ
阅读全文
摘要:题意:给定一张无向图,求1到给定点中,点权和最大的路径 题解: 据说是APIO最水的一道题……Tarjan缩点然后SPFA跑最长路(一开始敲成最短路了QAQ),当然也可以拓扑DP不过更麻烦一些 Tarjan的思路就是像遍历一棵树那样遍历整张图,记录每个节点的编号dfn[i]及其DFS树中子树所能回溯
阅读全文
摘要:题意:给定一张无向图,图中每条边均为白色或黑色,求有K个白色节点的边权和最小的生成树,数据保证有解 题解: 比较直观的想法是跑一个最小生成树,然后不断换边使得白边的数量等于K 然而我们可以给所有白边加上一个值,使其被选的几率增大或减小,而赋的值可以通过二分来找到。 #include <cstdio>
阅读全文
摘要:题意:给定一张无向图,图中每个边都有a,b两种边权,求一条从S到T的路径,使得路径中(a的最大值+b的最大值)最小 法一:我们先将边按a排序,每次加入一条边,然后将加入的边的两端入队,跑一边SPFA求从1到达每个节点路径上的最长的一条边的长度。这样需要跑M边SPFA,然而有一个优化——我们可以直接将
阅读全文
摘要:题意:求一个无向图的最小生成树与次小生成树的边权和是否相等 题解: 首先有一个性质,就是最小生成树上的任意两点的距离就是其在原图中的最短路,严格的证明我不会- -,但是由于Prim Dijkstra算法的过程完全相同,所以这个性质比较显然(不会证就不会证呗为何还要找理由QAQ) 还要一条性质就是无向
阅读全文
摘要:题意:求恰好经过K条边的最短路 题解:根据Floyd的性质,如果我拿一开始给出的两个边权矩阵(只经过一条边的最短路的邻接矩阵)跑Floyd,得到的一定是只经过两条边的最短路的邻接矩阵(普通的Floyd是用求出的最短路来更新最短路而非用初始矩阵),同理用两条边的邻接矩阵一定能得到四条边的,因此N条边的
阅读全文
摘要:题意:给订一张无向图,求一条S到T的路径,使得路径上的最大边权与最小边权的比值最小 题解:将边由小到大排序,暴力枚举最小边,然后借鉴Kruskal的思想,由小到大加入每一条大于初始边的边,检验S与T是否连通,若连通则更新答案,枚举下一条边。 #include <cstdio> #include <c
阅读全文
摘要:题意:给定N个变量和K个约束条件,形如x1==x2,x1-x2≥a……,求$\sum\limits_{i = 1}^N {{x_i}}$的最小值 题解: 首先差分约束系统是指形如:x[i]-x[j]<d[k]的形式的几个方程联立得到的方程组,其中d均为已知量,x均为未知量。(至于等于好嘛……d--不
阅读全文
摘要:题意:求每个节点v的$\sum\limits_{s \ne v,t \ne v} {\frac{{{C_{s,t}}(v)}}{{{C_{s,t}}}}}$,其中${C_{s,t}}(v)$为从s到t经过v的最短路的数量,${C_{s,t}}$为s到t的最短路的总数 题解:跑一边Floyd然后枚举判
阅读全文
摘要:题意:给定一张图,有可以将K条路径的花费变为0,求从1到N的最短路 题解: 分层图+最短路水过。 我们把原图复制K份,平行的放在一起(就像饼干一样一层层的),然后给每个图编号1 2 3……K,然后对于原图中每一条边(x,y),在i的x和i+1的y之间连一条边权为0的边,然后在这K个图上做最短路即可。
阅读全文
摘要:题意:给定一个图,图中有保护关系(u,v)表示到v之前必须先到一次u,求从1到N的最短路 题解: 定义d1[i]为直接到达i的最短距离,这个的更新和普通的Dijkstra一样 定义d2[i]为解除i的所有保护的最短距离(不一定要在i结束),这个更新起来很简单,每经过一个节点就将其所控制的城市的发生器
阅读全文
摘要:题意:给定N个正整数ai,求[L,R]中能凑出多少个数 题解: 首先取最小的ai,如果k*ai+x合法,则(k+n)ai+x均合法(其中L<=(k+n)ai+x<=R) 因此对于每一个x,我们只需要求出最小的k,然后就能算出所有的合法解的数量。 至于算k,用最短路就好 #include<map> #
阅读全文
摘要:题意:(这题没图不好说……大家还是自己去看吧) 题解: 首先有一点需要注意,就是题面中a和b数组搞混了…… 像势能分析那样,我们每花费一定金额b[i][j]就相当于得到了a[i][j]的势能,这样我们建图,图中每一个点均由花费(边权)、横纵坐标、势能四个量决定,显然转移的时候有: 势能==0:向下一
阅读全文
摘要:题意:给定限制条件(a,b)表示a必须在b之前,求所有合法序列中,小的数尽量在前面的方案 题解:首先我们根据限制条件建反向图,然后在反向图上求字典序最小的拓扑序(队列改为堆),逆序输出即可。 #include <queue> #include <functional> #include <cstdi
阅读全文

浙公网安备 33010602011771号