最短路
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj4289 PA2012 Tax(优化建图+Dijkstra)
首先我们考虑把无向图变成有向图,然后化边为点,新图中两点之间距离为边权的max,然后新建源点S向1的出边化成的点连边,边权为出边边权,新建汇点T,n的入边化成的点向T连边,边权为入边边权。然后S到T的最短路就是答案。这样最坏是O(m2)O(m^2)O(m2)的边。考虑优化建图:因为max(a,b)=a+max(b−a,0)max(a,b)=a+max(b-a,0)max(a,b)=a+max(b...原创 2019-06-24 16:22:44 · 232 阅读 · 0 评论 -
bzoj2324 [ZJOI2011]营救皮卡丘(Floyd+费用流,DAG最小权路径覆盖)
首先我们考虑最后的k条路线可能长成什么样子: 一定是0->x1->…->xn,x1< x2<…< xn的样子。也就是说我们只需用最多k条这样的路径,覆盖所有点即可。我们一定可以通过安排顺序,使得所有访问都合法。每个点都可以经过多次,我们想到需要预处理两点之间最短距离,且还要满足合法条件。可以用floyd预处理,在用mp[i][k]+mp[k][j]更新mp[i][j]时,保证k< j即可。mp[i原创 2017-12-29 21:56:30 · 437 阅读 · 0 评论 -
bzoj3055 礼物运送(Floyd+状压dp)
先Floyd预处理出两点间最短路径,然后状压dp,dp[s][i]表示状态为s的点都遍历了,停在i的最小时间。枚举一个j去转移就好了。然后处理出f[s],表示遍历了s状态的点的最小花费。然后枚举A遍历了哪些点,B必须遍历了其余点与1.取最大值就是最慢的,更新答案即可。复杂度O(2^n *n*n)注意初值只能给dp[1][1]=0.一开始在其他点都是非法的。原创 2018-01-13 22:03:33 · 397 阅读 · 0 评论 -
bzoj2007 [Noi2010]海拔(平面图最小割转对偶图最短路)
我们发现其实所有的海拔非0即1,什么四舍五入到整数,都是骗人的!然后我们显然发现,所有的0都和左上角相连,所有的1都是右下角相连,而唯一有贡献的流量就是0->1的流量,是不是很像最小割!所以我们就是要求一个平面图的最小割!但是,点太多了!我们可以像狼抓兔子那题一样,转化为对偶图求最短路即可。Dijkstra会更快些。spfa加优化也可以过。原创 2018-01-03 17:34:00 · 358 阅读 · 0 评论 -
bzoj1001 [BeiJing2006]狼抓兔子(最小割/平面图最大流转对偶图最短路)
首先这题显然就是求一个最小割。然后跑dinic加点优化也是可以过的。这题还有一种更妙的做法:st平面图最大流转对偶图最短路。大概做法就是首先在原图中加一条s->t的边,然后把原图的一个面当作一个点,每条边连接两个面,在对偶图中就是连接相应的点。然后对偶图中的一个环对应了原图的一个割。特别的,如果不看s->t这条边的话,对偶图中s->t的一个最短路就是原图的最小割。然后直接求最短路就好了。边数是和原图原创 2017-12-18 17:23:06 · 380 阅读 · 0 评论 -
loj6223「网络流 24 题」汽车加油行驶问题(分层图spfa)
dis(x,y,k)表示到点(x,y),剩余油量为k的最小距离。然后分层图spfa即可。注意油量为0时正好到达终点也是可以的。原创 2017-12-17 22:27:45 · 444 阅读 · 0 评论 -
loj6121「网络流 24 题」孤岛营救问题(状态压缩+spfa)
又是一道网络流24题中的最短路x 读题读了半天才读懂,我可能傻掉了。可以状压分层图来跑最短路即可。点数应该是O(nm2p)O(nm2^p)的。可以最后连向一个超级汇,方便得到答案。原创 2017-12-17 20:45:37 · 403 阅读 · 0 评论 -
bzoj4144 [AMPPZ2014]Petrol(spfa+贪心+离线+并查集)
首先对于每个点i,记离它最近的加油站为from[i],我们可以贪心的发现,在加油站a到加油站b的最短路(只经过非加油站)上,所有的点的from一定是这样的:前一部分都是a,后一部分都是b。也就是说只存在这样的一条边,他的两端点的from不同,记这条边的边权为w,则a到b的最短路为dis[a]+w+dis[b]。(dis[i]表示i到离它最近的加油站的距离)于是我们以所有加油站为源点,做一遍多源最短路原创 2017-12-16 16:52:24 · 333 阅读 · 0 评论 -
loj6009「网络流 24 题」软件补丁(状态压缩+spfa)
首先n很小,我们可以压缩状态来表示每个问题的修复情况,0表示未修复,1表示修好了,则我们要求的就是从0到bin[n]-1的最短路。则我们一共有O(2^n)个点,然后相当于m个转移,求一下最短路就好啦。复杂度O(2nm)原创 2017-12-11 22:14:27 · 290 阅读 · 0 评论 -
CIA3 NOI接站(tarjan缩环+Floyd传递闭包+可相交最小路径覆盖)
可以发现,题目求得就是一个可相交最小路径覆盖,但是有环。所以我们先用tarjan把环都缩掉,然后Floyd传递闭包,求二分图最大匹配,答案就是scc-ans.原创 2017-12-11 08:12:12 · 283 阅读 · 0 评论 -
poj2594 Treasure Exploration(可相交最小路径覆盖)
可相交最小路径覆盖,用floyd求出原图的传递闭包,即如果a到b有路径,那么就加边a->b。然后就转化成了最小不相交路径覆盖问题。原创 2017-12-08 22:31:20 · 280 阅读 · 0 评论 -
CF543B Destroying Roads(bfs+枚举)
因为边权都是1,所以可以bfs求得两点间最短路O(nm)O(nm)。然后考虑两条最短路如果不想交,则答案显然就是m-dis[s1][t1]-dis[s2][t2]。如果相交呢,那他们一定会有一段重合的,这样答案显然有可能更小,而且这样的情况下,只有可能在重合的两端分开,分开后就不可能再重合了。我们枚举这段重合的起点和终点i,j,判断是否合法,然后更新答案。注意:要把s1和t1交换一下,因为一共有四种原创 2017-11-21 13:42:35 · 395 阅读 · 0 评论 -
CF689B Mike and Shortcuts(单调队列/建图spfa/bfs)
这题做法很多,我太sb了,一直想不出来,看了题解才会。 可以只建i->i+1 i->i-1 i->a[i]三种边,然后spfa或者bfs求单源最短路。 还可以直接从左到右循环,一个点的最短距离只有两种情况,从i-1来,或者从右边某个捷径跳到的点回来,因为ai<=ai+1a_i<=a_{i+1} ,所以还可以用一个单调队列来维护从右边跳回来时的最优值。原创 2017-11-21 09:08:55 · 441 阅读 · 0 评论 -
luogu2662 牛场围栏(数论+最短路)
同余类spfa,以%最小数n的余数分类,建n个点,然后用其他的数去建边,从0开始跑最短路,每一种能凑出的最小数就是dis,而最大的不能凑出来的数就是dis-n。原创 2017-11-20 11:23:37 · 591 阅读 · 0 评论 -
CF507E Breaking Good(spfa+dp)
求最短路,同样最短时取好路最多的。还要记录路径。原创 2017-11-20 10:16:22 · 321 阅读 · 0 评论 -
CF400D Dima and Bacteria(并查集+Floyd)
首先判断是否可行,把0边链接的点都合并起来,看每一种类的所有点是不是都在一个集合内。然后缩成500个点,跑Floyd即可。原创 2017-11-19 21:22:02 · 271 阅读 · 0 评论 -
poj3463 Sightseeing(最短路计数+次短路计数)
求最短路的个数和比最短路大1的路的个数。可以写堆优化Dijstra,统计最短路个数和次短路个数,然后判断次短路是否是比最短路大1即可。松弛时讨论一下最小和次小的更新。原创 2017-11-14 13:10:11 · 387 阅读 · 0 评论 -
bzoj1143 [CTSC2008]祭祀river(最长反链长度,Floyd+二分图最大匹配)
在有向无环图中,有如下的一些定义和性质:链:一条链是一些点的集合,链上任意两个点x, y,满足要么 x 能到达 y ,要么 y 能到达 x 。反链:一条反链是一些点的集合,链上任意两个点x, y,满足 x 不能到达 y,且 y 也不能到达 x。那么很显然这道题就是求最长反链长度了。一个定理:最长反链长度 = 最小链覆盖对偶定理:最长链长度 = 最小反链覆盖原创 2018-01-07 15:33:13 · 454 阅读 · 0 评论 -
bzoj2718 [Violet 4]毕业旅行(同bzoj1143)
bzoj2718 [Violet 4]毕业旅行(同bzoj1143)原创 2018-01-07 15:37:59 · 365 阅读 · 0 评论 -
bzoj4061 [Cerc2012]Farm and factory(贪心+Dijkstra+切比雪夫距离)
记新首都为x点,我们对于每一个原来的点u都需要满足 dis[u][x]+dis[x][1]>=dis0[u][1],dis[u][x]+dis[x][2]>=dis0[u][2]dis[u][x]+dis[x][1]>=dis0[u][1],dis[u][x]+dis[x][2]>=dis0[u][2]dis[u][x]+dis[x][1]>=dis0[u][1],dis...原创 2018-07-05 23:40:55 · 406 阅读 · 0 评论 -
bzoj1922 [Sdoi2010]大陆争霸(Dijstra+贪心)
Dijkstra,有一些先后顺序的限制。 dis1[i]表示能到i的最早时间,dis2[i]表示能进入i的最早时间(即它的保护装置所在地都到达了的最早时间) 实际的最早到达时间就是max(dis1[i],dis2[i])。 跑Dij时没有被解除限制的城市先不入堆即可。#include <bits/stdc++.h>using namespace std;#define l...原创 2018-06-19 14:14:46 · 258 阅读 · 0 评论 -
bzoj4793 [CERC2016]Hangar Hurdles(bfs+最大生成树+贪心)
首先我们可以预处理出以每一个格子为中心的最大正方形边长。 (以每一个障碍为起点,跑八联通bfs即可) 那么能从x点挪到y点的最大正方形边长就是两点间路径最小值的最大值。 也就是求一个最大瓶颈边,我们想到了最大生成树。 不过这个是点权的,处理起来比较奇怪qaq 我们按点权从大到小处理每一个点,和这个点周围的四个点,如果已经加进去了,就连起来。钦定父亲节点权值小于儿子节点,维护这棵最大生成树...原创 2018-06-22 10:09:19 · 571 阅读 · 0 评论 -
Codeforces Round#485
CF986A Fair(贪心+最短路) CF986B Petr and Permutations(BIT+排列性质)A#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100010inline char gc(){ ...原创 2018-05-31 10:14:09 · 313 阅读 · 0 评论 -
bzoj3258 秘密任务(Dij+最小割+tarjan)
首先跑两边Dijkstra,只留下一定存在在最短路上的边。 然后把一条边拆成两条边,权值分别为起终点的权值。 现在我们就是要花最小的代价把1,n割开,于是求一个最小割。 还要判定最小割是否唯一。可以对残余网络tarjan缩点。 如果一条边是割边,那么需要满足: 1、满流边 2、bel[x]!=bel[y] 如果还满足bel[x]==bel[s]&&bel[y]==be...原创 2018-06-13 12:27:38 · 324 阅读 · 0 评论 -
bzoj3073 [Pa2011]Journeys(线段树优化建图+最短路)
一个区间的点向另一个区间的点连双向边。求单源最短路。 我们考虑线段树优化建图。 因为有两个方向,因此我们需要建两颗线段树。 A线段树儿子向父亲连边,表示一条有向边的起点 B线段树父亲向儿子连边,表示一条有向边的终点 B线段树的每个节点向A线段树的对应节点连边(一条有向边的终点,同时是下一条有向边的起点,其实只连叶子就行) 这些边边权均为0.然后对于每一天,新建一个节点表示(a,b)->(原创 2018-04-26 22:47:22 · 306 阅读 · 0 评论 -
bzoj1975 [Sdoi2010]魔法猪学院(K短路,A*算法)
裸的K短路。听说内存会炸。。。反正bzoj上过了qaq 一个小剪枝:如果新扩展的点的路径总长度已经大于E了就不扩展了。原创 2018-04-06 18:26:27 · 223 阅读 · 0 评论 -
poj2449 Remmarguts' Date(K短路,A*算法)
求S->T的第K短路。估值函数f(x)=g(x)+h(x),g(x)表示从起始搜索点到当前点的代价(即本题中的从S到x的已走距离)。h(n),它表示启发式搜索中最为重要的一部分,即当前结点到目标结点的估值,h(n)设计的好坏,直接影响着具有此种启发式函数的启发式算法的是否能称为A*算法。而本题中的h(x)就是x点到T的距离,就是实际值,所以复杂度是有保证的。我们用一个优先队列,每次取出f(x)最小的原创 2018-04-06 17:40:30 · 273 阅读 · 0 评论 -
bzoj2725 [Violet 6]故乡的梦(最短路树+线段树)
每次询问删去一条边之后的S-T最短路。 我们首先搞出最短路树。然后对于每一条在S-T最短路上的边都处理出删掉他之后的答案。类似bzoj4400然后对于询问O(1)回答即可。此题需要注意一些特判:比如S==T S,T一开始就不联通。原创 2018-04-16 21:17:48 · 491 阅读 · 0 评论 -
bzoj4400 tjoi2012 桥(最短路树+线段树)
首先我们建出最短路树。 可以发现要删的边一定在最短路树上1-n的路径上。 我们考虑删掉一条边x-y,那么剩余的最短路一定是1-A-B-n的形式。 其中1-A一定是最短路上一部分,不能过边x-y,因此A一定不在y的子树里。 B-n一定是最短路上一部分,不能过边x-y,因此B一定在y的子树里。 而此时的最短路长度就是dis[A][0]+dis[B][1]+w[A][B]。我们给每个点标深度,1原创 2018-04-16 20:06:52 · 544 阅读 · 0 评论 -
bzoj5140 [Usaco2017 Dec]A Pie for a Pie(最短路+set)
其实就是建图,多源点最短路。但是呢边数最坏是O(n2)O(n^2)级别的,暴力建图会gg(不过数据水,跑的还贼快,快卡掉它吧(逃) 我们发现对于一个点x,他能连向的点是点权在[x,x+d]范围内的点,边权均为1,于是我们可以直接bfs,每个点只入队一次。每次快速的找到未入队的点中能连向的点,并删除即可。我们可以用一个set来支持这个操作。复杂度O(nlogn)不会自定义比较函数gg,只好set+p原创 2018-03-25 20:03:27 · 446 阅读 · 0 评论 -
bzoj1027 [JSOI2007]合金(计算几何+Floyd)
因为a+b+c=1,所以可以只看前两维,忽略第三维。 把每种合金看做一个二维平面上的点,我们可以证明两种合金的连线上的合金都可以由这两种合成出来。进而我们可以发现,选择的原材料合金围成的凸包中的点我们都可以合成出来。因而问题就转化为:在点集A中选择一个子集S,使得点集B中的所有点都处于子集S围成的凸包中,最小化子集S的大小。我们可以利用floyd求最小环来解决:枚举点集A中的任意两点i,j(i可以原创 2018-03-31 11:44:05 · 207 阅读 · 0 评论 -
luogu1850【2016提高】换教室(期望dp+floyd)
首先floyd处理两点间最短路,然后期望dp。注意你不知道申请是否成功,因此0/1只能表示你是否进行了申请,至于结果如何,要乘上概率。#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 2010inline int read(){...原创 2017-11-07 10:13:03 · 305 阅读 · 0 评论 -
bzoj3931 [CQOI2015]网络吞吐量(Dijkstra+最大流)
先Dijkstra求出dis数组,然后判断每条边是否可以经过,如果可以就建边,容量为inf。点权限制,拆点。最大流就是答案了。原创 2018-01-09 23:13:02 · 457 阅读 · 0 评论 -
bzoj1097 [POI2007]旅游景点atr(spfa+状压dp)
首先spfa预处理一下K个点以及起终点之间的最小距离。 然后比较显然的状压dp。f[S][i]表示走过了状态为S的点,现在在i的最短路。枚举一个j去转移,判断一下合法就好了。复杂度看上去是O(km+2kk2)O(km+2^kk^2)的。原创 2018-01-25 22:43:56 · 279 阅读 · 0 评论 -
zoj2760 How Many Shortest Path(Floyd+最大流)
求两点之间边不相交最短路个数。先Floyd预处理两点间距离,然后判断每一条边是否可以在最短路上,如果可以,就建边x->y,容量为1.然后s到t的最大流就是答案。原创 2018-01-08 13:54:49 · 266 阅读 · 0 评论 -
NOIP2017普及组
A.。。。 B.枚举 C.建图spfa。 D.二分答案+dp+单调队列优化。原创 2017-11-14 10:56:25 · 551 阅读 · 0 评论 -
NOIP模拟10.22
2014提高D2 A.无线网络发射器选址 暴力枚举选在哪即可。AC B.寻找道路 图论+bfs+spfa AC C.解方程 数论+筛法+枚举。 脑残没想到取模,去写高精度,结果当然是挂了。只拿了30.具体题解见这里原创 2017-10-22 23:05:57 · 212 阅读 · 0 评论 -
bzoj4992 [Usaco2017 Feb]Why Did the Cow Cross the Road(分层图最短路)
把每个点拆成三个点,分别表示走了%3余0步到i,记作3*i+0,走了%3余1步到i,记作3 *i+1,走了%3余2步到i,记作3 *i+2。每个点i可以向上下左右走一步到达j点,所以对于i,j我们建三条有向边,从 3*i走到3*j+1,边权为t,从3*i+1走到3*j+2,边权为t,从3*i+2走到3*j,边权为t+a[j] (第三步有附加值)。然后以3为源点跑一遍spfa即可。最后答案就是3*n*原创 2017-09-07 17:14:00 · 762 阅读 · 0 评论 -
bzoj2763 [JLOI2011]飞行路线(分层图最短路)
d[i][j]表示到i点,用了j次免费的最短路,每个j对应了一层。因此唤做分层图。更新时,本层自然要做,还可以跨维度的把下一层也影响了。不过我跑得好慢。。。看各位神犇都是1S以内的。原创 2017-09-07 20:40:50 · 685 阅读 · 0 评论 -
bzoj1179 [Apio2009]Atm(tarjan缩点+spfa)
tarjan缩点之后不会有正权圈,跑spfa即可。原创 2017-09-15 13:16:42 · 282 阅读 · 0 评论