图论算法
文章平均质量分 90
AndrewMe8211
no more threads
展开
-
luogu P3393 逃离僵尸岛
analysis关键是解决这个问题:给你几个点,其他的点离这些给出的点的最近距离是多少这个很简单:我们可以自己给出一个点,然后向每个被标记的点连一条单向边,这样就只需要进行一次 dijkstra 就可以了。code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(regis...原创 2019-10-10 18:39:50 · 264 阅读 · 0 评论 -
UVA10537 The Toll! Revisited
analysis如果可以求出一个数组d[i]表示从i到达终点所需要的最少金额的话,这道题就解决了呗但是如何求出这个数组呢?可以用dijkstra来反推,把终点的距离设为最后一行的数字(也就是需要运到终点的货物量),然后对整个图以合适的松弛操作反着跑一个dij,然后就求出了这个数组于是现在最关键的问题就是如何松弛:对于边u到v,由于我们是反向跑的,因此如果u是一个城市,那么v走到u必然就...原创 2019-08-28 11:55:28 · 136 阅读 · 0 评论 -
CF1005F Berland and the Shortest Paths
analysis是的,这道题是用最短路树(图)做的要证明(理解)最短路树(图)就是本题的合法答案的话,有下面两种方式假设我们现在有随机的一个方案(n-1条边),那么对于每一个点i,如果它的did_idi在用方案里n-1条边的时候不是最小值的话说明还可以更改路径使得did_idi更小,而最短路树(图)上面的每个点的did_idi都是最小的,因此总和∑di\sum d_i∑di也是...原创 2019-08-28 08:41:47 · 164 阅读 · 0 评论 -
UVA10917 Walk Through the Forest
analysis其实类似求最短路树,这道题是求一个最短路图(最短路图一定是一个DAG)一次dij解决最短距离问题然后用一次记忆化搜索解决路径统计code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#...原创 2019-08-27 20:10:01 · 141 阅读 · 0 评论 -
UVA1416 Warfare And Logistics
( 1<= n<=100, 1<=m<=1000)analysis很容易想到用暴力来每次暴力删除一个边然后跑各种最短路,比如Floyd和dijkstra时间复杂度分别为O(mn3)=1e9O(mn^3)=1e9O(mn3)=1e9和O(nm2logn)=6.6438561897747246957406388589788e8O(nm^2logn)=6.64385...原创 2019-08-27 19:26:12 · 114 阅读 · 2 评论 -
UVA11374 Airport Express
analysis第一眼看到这个题就知道是分层图最短路了因为每个点可以做决策决策次数比较少嗯,就是分层图最短路了这个题的状态呢只有两个,其一就是没有使用商业车票,另一个就是使用了商业车票两个状态之间的连边也很简单了,设用过商业车票的那一层的点的标号为原来的点的标号+n,于是对于一条u到v的普通路线,连u到v和u+n和v+n(双向边要连两次!),对于一条u到v的商业路线,连u到v+...原创 2019-08-26 20:39:08 · 126 阅读 · 0 评论 -
It's not a Bug, it's a Feature! UVA - 658
analysis这个是可以抽象为最短路问题的用状态压缩来表示bug的有无(0没有,1有)那么就可以把每个bug的状态表示的数看做点,然后就可以从(11111…111)开始,枚举每一个补丁,判断并且进行状态转移跑一个dij后直接看0号点(00000…000)的距离就可以判断答案了话说不要乱用map来hash,因为map的每一次操作都是logn的,我就是因为乱用map来Hash导致TLE。...原创 2019-08-26 19:11:10 · 335 阅读 · 0 评论 -
UVA - 247 Calling Circles
translate有n个人打电话,给出很多个u->v的打电话的关系定义u给v打电话(直接或间接),且v给u打电话(直接或间接),则u,v在同一个Calling Circles(电话环)里面然后输出所有Calling Circles里面的人analysis分析后发现,打电话这个关系是有连通性的在进一步分析的话这个题是符合scc缩点的模式的(tarjan)于是直接套tarjan就...原创 2019-08-26 11:51:31 · 189 阅读 · 0 评论 -
【Floyd求无向图最小环】一本通 3.2 例 1」Sightseeing Trip
analysis思路这算是弗洛伊德的一个活用版本了这个模式就是图中求最小环的长度和方案,然后时间复杂度必须要允许思路就是枚举一个k和和它相邻的两个点,看这三个点能否构成一个最小环但是注意,因为找环的时候是保证了环中出现的点在k以内且经过点k的,而且不能出现把一条链来回走然后把这种方案当做一个环的情况因此在找环的时候枚举i,j的时候应该 loop(k,1,n){ loop...原创 2019-08-23 11:43:08 · 451 阅读 · 0 评论 -
P2176 [USACO14FEB]路障Roadblock
analysisDIJ先求一个最短路然后暴力枚举最短路径上的每条边将边权double,然后再跑最短路,最后取最大值code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define anti_loop...原创 2019-08-16 19:52:05 · 210 阅读 · 0 评论 -
Dijkstra的救赎
SPFA的复杂度大约是O(kE),k是每个点的平均进队次数(一般的,k是一个常数,在稀疏图中小于2)spfa似乎是个神话,统领着正权最短路算法世界,各个领域都有他的痕迹,直到:随着网格图银光闪闪的大刀出鞘,spfa人头落地,其在正权最短路算法世界的统治宣告结束对于|V|,|E|在10^5级别的题目,正解肯定不是SPFA(不然就是错题)这时需要一个人来拯救处于混乱中的正权最短路算法...原创 2019-08-16 11:28:04 · 99 阅读 · 0 评论 -
poj3613 ACwing 345:Cow Relays--牛站
analysis这是一个没有见过的模式:特征求S到E恰好走过N条边的最短路点数少到可以用邻接矩阵存解法Floyd+矩阵加速递推(快速幂)code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;+...原创 2019-08-25 21:17:14 · 221 阅读 · 0 评论 -
luogu P4568 [JLOI2011]飞行路线
analysis基本上是第一次见这个模式(上一次是在luogu P3119)这个模式的特征大概就是:在一个正常的图上可以进行 k 次决策,对于每次决策,不影响图的结构,只影响目前的状态或代价那么这个题就是这个模式嘛,可以做k次决策,做了之后会影响到后面走的距离,图实际上没有改变于是就可以拆点分层了,把一个点强行拽成k个,然后就可以连边了。怎么连呢?首先原来就有的边是不能不连的,而且还要在...原创 2019-08-15 21:07:15 · 190 阅读 · 0 评论 -
luogu P3119 [USACO15JAN]草鉴定Grass Cownoisseur
analysis首先要缩点之后如果不考虑反向走边的话,这题就是一个大水题但要考虑的话,可以用分层图最短路的思想来解决考虑一张图,将这个图复制一份,点的编号从1~ N到(N+1)~(N+N)。然后在两层图中连边。对于原图上的每一条边,从原图的指向点到新图的起始点连一条边,边权与原边相同,代表逆向走一条边。逆向走了一条边,就不能再逆向走了,所以从上面的一层(新图)无法回到下面的一层。最后跑一...原创 2019-08-15 19:00:56 · 1457 阅读 · 0 评论 -
luogu P2515 [HAOI2010]软件安装
自定义HP背景好评!analysis有传递关系,还可能成环?缩点!缩点后呢?显然是一棵树了求整棵树分W空间的收益,和子树分Wi空间的收益好像有点关系子问题相似,边界问题就是叶子结点emm,树形DP吗?试一下,好像可以诶!于是就这样做:缩点树形DP时间复杂度 O(n3)O(n^3)O(n3)code#include<bits/stdc++.h>using...原创 2019-08-15 11:54:06 · 109 阅读 · 0 评论 -
luogu P4011 孤岛营救问题 #10073. 「一本通 3.2 例 2」拯救大兵瑞恩
analysis分层图最短路+01BFS这里不需要建图,图在心中code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define clean(arry,num) memset(arry,num,si...原创 2019-08-23 18:02:33 · 343 阅读 · 0 评论 -
luogu P3831 [SHOI2012]回家的路
analysis符合分层最短路的特征,于是考虑使用分层最短路第一层只走横向边,边该怎么连就怎么连第二层只走纵向边,同理两层之间的点之间连一条权值为1的边,代表换方向的花费然后就跑一个最短路就可以了(这题不卡spfa)具体处理的时候可以把起点和终点看做可以0花费变向的点和其他转向点一起处理,且各个坐标分别按照x和ysort一遍,然后就可以建图了code#include<bit...原创 2019-08-19 15:28:09 · 225 阅读 · 0 评论 -
LOJ #10131. 「一本通 4.4 例 2」暗的连锁
analysis这是一道好题诶!对于我这种蒟蒻来说是属于比较考思维的一道题开始看到题一脸懵逼,根本不知道从何下手看到书上的讲解后才恍然大悟:原来就是个差分嘛!我们枚举每条非树边(x,y),把x到y路径上所有边的边权+1,对于每条树边,如果边权为0,则切断它之后原图已经不联通,第二条边随便切一条,共m种方案。如果边权为1,则第二步必须切断对应的那条边,方案数1,如果边权大于2则没有方案。...原创 2019-07-19 19:29:08 · 288 阅读 · 1 评论 -
UVA11090 Going in Cycle!!
analysis二分+spfa判负环,绝了!为什么会想到二分?因为问题可以转化为一个单调函数:平均值越大,存在这种环的可能性就越小也就是说可以二分平均值然后判断是否存在就可以了判断如何存在的话,可以考虑这样的回路的性质:如果对于一个平均值x,存在这样的一个回路A使得A的平均值小于x,那么∑i∈Alen[i]∣A∣<x\frac{\sum_{i\in A}len[i]}...原创 2019-08-28 17:18:04 · 151 阅读 · 0 评论 -
「一本通 3.4 例 1」 POJ 1201-Intervals
analysis本题使用差分约束求解:设sis_isi为1到i所选的数的个数,我一开始是这样列的:{sbi−sai−1>=ci0<=si<=bi0<=si−si−1<=1\begin{cases}s_{b_i}-s_{a_i-1}>=c_i\\0<=s_{i}<=b_i...原创 2019-08-30 16:14:33 · 425 阅读 · 0 评论 -
luogu P3199 [HNOI2009]最小圈
analysis首先要理解题目中的那个"圈"的含义这个圈不是强连通分量!这就说明这个题和scc或tarjan没什么关系因为他说的是:c=(c1,c2,⋯ ,ck)(ci∈V)c=(c_1,c_2,\cdots,c_k)(c_i\in V)c=(c1,c2,⋯,ck)(ci∈V)是GGG中的一个圈当且仅当(ci,ci+1)(1≤i<k)(c_...原创 2019-09-14 15:47:48 · 149 阅读 · 0 评论 -
luogu P4943 密室
analysis首先简化问题,即哈利和罗恩是等价的,也就是说罗恩能走的地方哈利都能够走(可怜的韦斯莱),所以我们可以只考虑哈利对于哈利(哈利+罗恩)最后完成任务的方式,可能有以下三种情况:从1到达第一个房间+从1到达第二个房间从1到达第一个房间然后到达第二个房间从1到达第二个房间后到达第一个房间我们只需要把这些方案的最短路算出来做一个比较就可以了但是注意第一种情况中...原创 2019-09-14 09:23:13 · 110 阅读 · 0 评论 -
luogu P2868 [USACO07DEC]观光奶牛Sightseeing Cows
analysis题目要求的是最大平均乐趣值,相当于就是求∑i=1PW[iu]+W[iv]C[i]\sum_{i=1}^{P}\frac{W[{i_u}]+W[{i_v}]}{C[i]}i=1∑PC[i]W[iu]+W[iv]的最大值但是题目里有一个条件,就是说每个建筑物只能走一次(废话,不然的话直接在最快乐的那个建筑物那里一直待着就可以了啊),并且必须要走过一条边先考虑第二...原创 2019-09-07 10:57:22 · 182 阅读 · 0 评论 -
luogu P2384 最短路
analysis首先想到是直接跑最短路,如果乘法不会溢出,不考虑取模,这道题就很水但是一旦取模,就可能导致本来的较大距离偏小这个时候就发现,由于新的松弛方程里面出现了乘法,我们可以用对数来将其转化为加法,转化后有一个好处就是避免了溢出的情况,由于边最长就10000,点最多就1000个,根本不需要考虑溢出的问题于是先跑一次最短路求出最短路树(用父亲表示法),然后从点n倒推会点1,这个时候在...原创 2019-09-04 21:15:58 · 231 阅读 · 0 评论 -
luogu P2865 [USACO06NOV]路障Roadblocks
analysis第2短路,新模型核心思想是在最短路更新的时候同时带上次短路更新这是一定可行的!讨论如下:对于边u−>v设dis(x,0)为起点x的最短路长度,设dis(x,1)为起点x的次短路长度对于边u->v\\设dis_{(x,0)}为起点x的最短路长度,设dis_{(x,1)}为起点x的次短路长度\\对于边u−>v设dis(x,0)为起点...原创 2019-09-04 20:47:57 · 132 阅读 · 0 评论 -
luogu P1726 上白泽慧音
analysis<x,y>这个条件其实就是环,本题也就是找环(可能环套环套环套环套环…),这不就是tarjan吗模板题(一开始不知道是哪根筋抽了没看出来)code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=...原创 2019-09-04 15:00:55 · 115 阅读 · 0 评论 -
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
analysistarjan+DAG的DP本题ACcode#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define clean(arry,num) memset(arry,num,sizeof(ar...原创 2019-09-04 11:41:01 · 120 阅读 · 0 评论 -
POJ 1094_Sorting It All Out
analysis一开始看到这种传递性的题以为是tarjan,结果发现书上给的是Floyd传递闭包对于不等式i<j,就让G[i][j]=1,其他情况G[i][j]=0然后跑一次传递闭包,G数组里面就存好了在当前给出的不等式条件下的所有数之间的大小关系如果存在G[i][j]=G[j][i]=0,说明不能确定大小关系如果存在G[i][j]=G[j][i]=1,说明矛盾至于输出方案数,...原创 2019-09-03 19:12:51 · 160 阅读 · 0 评论 -
luogu P4878 [USACO05DEC] 布局
analysis首先题目给的两个不等式需要列出来:{dis[Bi]−dis[Ai]<=Di(i∈[1,ML])dis[Bi]−dis[Ai]>=Di(i∈[ML+1,ML+MD])\begin{cases}dis[B_i]-dis[A_i]<=D_i(i\in[1,M_L])\\dis[B_i]-dis[A_i]>=D_i(i\i...原创 2019-09-03 15:41:20 · 145 阅读 · 0 评论 -
poj1275 「一本通 3.4 例 2」出纳员问题
analysis有点麻烦这道题的题解在数与图的完美结合-------浅析差分约束系统华中师大一附中 冯威这篇国集论文里面有,这篇论文很不错还是说一下大概的思路(自己敲了半天也没敲出来思路):设num[i] 为来应聘的在第i个小时开始工作的人数r[i] 为第i个小时至少需要的人数x[i] 为招到的在第i个小时开始工作的人数根据题意有:0 <= x[i] <...原创 2019-09-02 16:31:01 · 864 阅读 · 0 评论 -
luogu P3084 [USACO13OPEN]照片Photo
analysis不等式组:(ai,bi)=>{xbi−xai<=1xbi−xai>=1 (a_i,bi)=>\begin{cases} x_{b_i}-x_{a_i}<=1\\ x_{b_i}-x_{a_i}>=1\\ \end{cases} (ai,bi)=>{xbi−xai<=1...原创 2019-09-02 11:28:30 · 139 阅读 · 0 评论 -
关于差分约束和最短路
part Ⅰ差分约束系统的定义:如果一个系统由n个变量和m个约束条件组成,形成m个形如ai−aj≤k(i,j∈[1,n],k为常数)的不等式则称其为差分约束系统如果一个系统由n个变量和m个约束条件组成,形成m个形如\\ai-aj≤k(i,j∈[1,n],k为常数)\\的不等式则称其为差分约束系统如果一个系统由n个变量和m个约束条件组成,形成m个形如ai−aj≤k(i,j∈[1,n],k为...原创 2019-09-02 09:05:42 · 404 阅读 · 0 评论 -
UVA11478 Halum
translate给定一个有向图,每条边都有一个权值,每次你可以选择一个节点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后要让所有边的最小值非负且尽量大analysiscode#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(regist...原创 2019-09-01 16:02:23 · 147 阅读 · 0 评论 -
luogu P3275 [SCOI2011]糖果
analysis至少,暗示我们这题差分约束是最短路然后构建差分约束系统:case1:{xa<=xbxb<=xacase2:xa<=xb−1case3:xb<=xacase4:xb<=xa−1case5:xa<=xbcase5+:∀xi>=1case1:\begin{cases}x_a&am...原创 2019-08-31 22:12:24 · 140 阅读 · 0 评论 -
luogu P1993 小K的农场
analysis就是判断一组不等式是否有解于是建立差分约束系统,有三个不等式(因为这个题没有要求作物个数的正负,我们完全可以使其为负):case1:ai−bi>=cicase1:a_i-b_i>=c_icase1:ai−bi>=cicase2:ai−bi<=cicase2:a_i-b_i<=c_icase2:ai...原创 2019-08-31 22:06:37 · 148 阅读 · 0 评论 -
luogu P1522 牛的旅行 Cow Tours
analysis很容易想到n方来暴力找一个连接方案,然后在连接后的图中跑Floyd,时间复杂度…于是考虑如何优化n方暴力枚举后找新图直径的过程:连接一条边后,新图直径可能是原来两个块中的直径中较大的那个或者新连接的这条边两端点在他们各自的块中的最远点距离之和和这条边的权值的和于是我们可以预处理出两个直径和每个点的最远点,然后就可以用一个O(n)O(n)O(n)的扫描得到答案了大约...原创 2019-08-30 20:21:26 · 129 阅读 · 0 评论 -
luogu P1119 灾后重建
analysis这种动态又具有一定单调性限制的最短路就要考虑Floyd仅需吧最外层循环的点k设为当前时间限制下可用的点就可以了Floyd的变式常见两种:对外层循环k的限制对方程的修改code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i...原创 2019-08-30 17:32:13 · 130 阅读 · 0 评论 -
luogu P1608 路径统计
analysis最短路计数注意当spfa中一个点计算完了后,一定要记得将它清零,否则会造成重复计算,如下图:同时,记得处理重边,否则会导致路径数偏多(题目认为城市u,v之间所有等长的边都是同一条路)code// luogu-judger-enable-o2#include<bits/stdc++.h>using namespace std;#define loop(...原创 2019-07-29 09:44:16 · 137 阅读 · 0 评论 -
loj #10094. 「一本通 3.5 练习 2」消息的传递
analysis模版。。。。。code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define anti_loop(i,start,end) for(register int i=start;i>...原创 2019-05-24 10:39:07 · 293 阅读 · 0 评论 -
luogu P2330 [SCOI2005]繁忙的都市
分析找MST中权值最大的边即可code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define clean(arry,num); memset(arry,num,sizeof(arry));int ...原创 2019-02-18 16:16:38 · 165 阅读 · 0 评论