最短路
andyc_03
这个作者很懒,什么都没留下…
展开
-
【最短路构造】P2371 [国家集训队]墨墨的等式
更加感性的理解就是求一个dis[i]表示由n个 a[i] 求和 modT 为 i 的最小值这样就可以先跑一遍最短路,算出dis,然后从0到T-1走一遍,算出在Bmin-Bmax有多少数就行了代码#include<bits/stdc++.h>using namespace std;#define PLI pair<long long ,int>const int maxn=15;typedef long long ll;const int N=5...原创 2020-11-21 11:15:17 · 176 阅读 · 0 评论 -
【分层图最短路】P2939 [USACO09FEB]Revamping Trails G
将整个dijkstra的操作加上一维k就行了注意dis赋极大值的时候要从0-k都赋上!代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e4+5;const int maxm=5e4+5;const ll inf=1e17;int n,m,k,cnt,head[maxn],vis[maxn][22];struct edge{ int t...原创 2020-11-20 23:16:25 · 149 阅读 · 0 评论 -
【最短路】P4667 [BalticOI 2011 Day1]Switch the Lamp On
对角线建边,原来有的边权为0转一次方向边权为1然后最短路就行代码//吸了氧才能过#include<bits/stdc++.h>using namespace std;#define PII pair<int,int>const int maxn=505;const int inf=0x3f3f3f3f;int n,m,tot,ccnt;char mapp[maxn][maxn];int cnt[maxn][maxn],...原创 2020-11-20 22:38:58 · 283 阅读 · 0 评论 -
【最短路构造】bzoj2259 [Oibh]新型计算机
「BZOJ2259」[Oibh] 新型计算机 Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题。 但是,有一个难题他却解决不了,是这台计算机的输入问题。新型计算机的输入也很独特,假设输入序列中有一些数字(都是自然数——自然数包括0),计算机先读取第一个数字S1,然后顺序向后读入S1个数字。接着再读一个数字S2,顺序向后读入S2个数字……依此类推。不过只有计算机正好将输入序列中的数字读完,它才能正确处理数据,否则计算机就会进行自毁性操作! Tim现在.原创 2020-11-19 00:13:34 · 283 阅读 · 0 评论 -
【最短路】P2296 寻找道路
题目要求路径上的点都能直接或者间接的经过ed,所以我们建反图,搜索一次能经过的点,然后去计算一下能经过的点然后再原图上跑一下最短路即可注意:计算能经过的点的时候要用原图啊!!调了好久代码#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;const int maxm=2e5+5;int n,m,st,tot,ed,dis[maxn],flag[maxn],abl...原创 2020-11-18 23:03:35 · 216 阅读 · 0 评论 -
【floyd】vijosP1046 观光旅游
背景湖南师大附中成为百年名校之后,每年要接待大批的游客前来参观。学校认为大力发展旅游业,可以带来一笔可观的收入。描述学校里面有N个景点。两个景点之间可能直接有道路相连,用Dist[I,J]表示它的长度;否则它们之间没有直接的道路相连。这里所说的道路是没有规定方向的,也就是说,如果从I到J有直接的道路,那么从J到I也有,并且长度与之相等。学校规定:每个游客的旅游线路只能是一个回路(好霸道的规定)。也就是说,游客可以任取一个景点出发,依次经过若干个景点,最终回到起点。一天,Xiaomengxian决原创 2020-11-18 21:27:29 · 164 阅读 · 0 评论 -
2020复习专题——最短路
1.floyd2.dijkstra3.spfa【spfa判负环】P2850 [USACO06DEC]Wormholes G原创 2020-11-16 23:39:09 · 129 阅读 · 0 评论 -
【spfa判负环】P2850 [USACO06DEC]Wormholes G
直接spfa判负环即可,判断每个点入队的次数是否大于n代码#include<bits/stdc++.h>using namespace std;const int maxm=2705;const int maxn=505;struct edge{ int to,nxt,v;}e[maxm<<1];int n,m,w;int cnt,head[maxn],dis[maxn],flag,in[maxn],tot[maxn];void a...原创 2020-11-16 23:34:11 · 132 阅读 · 0 评论 -
P5022 旅行
给定一个树/基环树,求遍历字典顺最小的方案当原图是一棵树的时候,可以直接贪心的进行操作当原图是一棵基环树的时候,我们先找到树上的环,然后枚举环上的一条边,将其删去,剩下的就和树上的操作一样了,最后将所有得到的方案进行比较,输出最小的即可代码#include<bits/stdc++.h>using namespace std;const int maxn=5005;int n,m,tot,vis[maxn],out[maxn],ans[maxn];vector &l.原创 2020-09-10 22:45:29 · 87 阅读 · 0 评论 -
【最短路】P4408 [NOI2003]逃学的小孩
对于一张图上的任意三个点A,B,C 求max(min(dis[A][C],dis[B][C])+dis[A][B])我们先确定A,B为树上直径,可以用反证法简单证一下然后就可以对于A和B两个点算一下其他点到A/B的距离,然后枚举点C即可代码#include<bits/stdc++.h>using namespace std;const int maxn=200000+5;int n,m,tot,st,ed;int head[maxn];long long dis.原创 2020-09-10 22:42:01 · 118 阅读 · 0 评论 -
【分层图最短路】P4568 [JLOI2011]飞行路线
将免费乘坐的机会看做两个层之间的边,对于读入的每天一条边,都再k层内建边,以及跨层建边然后就可以跑dijkstra注意:最后的答案可能不在dis[t+k*n]上,因为最优解可能没有使用k次免费的机会,所以需要统计一下每层t位置的dis值,取最小即可代码#include<bits/stdc++.h>using namespace std;const int maxn=5e6+5;int n,m,k,s,t;int dis[maxn],vis[maxn],head[m.原创 2020-09-08 23:53:27 · 126 阅读 · 0 评论 -
【拓扑序】P1038 神经网络
先从入度为0的点开始,进行拓扑序列的计算,由于这个公式中的U(阈值)没有参与到乘法的部分,可以直接移项到左侧,进行计算就可以了,最后,输出出度为0的点的信息代码#include<bits/stdc++.h>using namespace std;const pair<int,int> PII;const int maxn=50000+5;const int inf=0x3f3f3f3f;int n,m,tot,in[maxn],out[maxn],head[.原创 2020-09-07 22:36:12 · 80 阅读 · 0 评论 -
【最短路】P3008 [USACO11JAN]Roads and Planes G
题目描述有两种边:1.无向无负边权 2.有向有负边权由于负边权的存在,无法直接使用dijkstra而这道题目会卡spfa,因此我们需要去考虑其他的方法我们可以先将第1种边连上,然后进行tarjan缩点(貌似并查集会更简单)然后,对于生成的DAG图,可以用拓扑来求每个缩点后的点之间的最短路,每个集团内部的最短路,可以用dijkstra来计算代码#include<bits/stdc++.h>using namespace std;const pair&l..原创 2020-09-07 22:33:40 · 130 阅读 · 0 评论 -
【最短路】P3393 逃离僵尸岛
首先用bfs跑出s层以内的危险城市,然后就可以dijkstra了注意开long long 还有初值要够大代码#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;typedef pair <long long ,int> PIL;int n,m,k,s;int p,q;int flag[maxn],vis[maxn],head[maxn],cnt;long long di..原创 2020-08-30 21:06:03 · 241 阅读 · 0 评论 -
【最短路】P5837 [USACO19DEC]Milk Pumping G
题面描述:有一n个点,m条边的双向图,每条边都有花费和流量,求从1~n的路径中,求由于流量较小,所以可以枚举最小流量,然后跑dijkstra代码#include<bits/stdc++.h>using namespace std;const int maxn=1005;const int inf=0x3f3f3f3f;typedef pair<int,int> PII;struct edge{ int to,val,flow;}tmp;..原创 2020-08-30 19:51:30 · 392 阅读 · 0 评论 -
【最短路】P3905 道路重建
这道题的建边还是挺有趣的因为要求重修道路的最小值,所以没被破坏的道路就可以将其边权赋为0,然后将被摧毁的边权保留正常,然后就可以跑最短路了floyd代码#include<bits/stdc++.h>using namespace std;const int maxn=105;int n,m,t,ma[maxn][maxn],f[maxn][maxn];int main(){ freopen("a.in","r",stdin); freopen("a.out",".原创 2020-07-30 01:00:47 · 213 阅读 · 0 评论 -
【差分约束】P4878 [USACO05DEC]Layout G
差分约束建边后,两次spfa,一次判断有无负环,另一次用于计算答案代码#include<bits/stdc++.h>using namespace std;const int maxn=1005;const int maxm=50005;const int inf=0x3f3f3f3f;int n,ml,cnt,mr,update[maxn],head[maxn],dis[maxn],vis[maxn];struct edge{ int to,nxt,v;}G[.原创 2020-07-25 14:23:39 · 136 阅读 · 0 评论 -
【差分约束+spfa优化】P3084 [USACO13OPEN]Photo G
这道题和种树差不多,但是n和m数字较大,所以加上了SLF优化,但是最后一个点还是不过,待修改!#include<bits/stdc++.h>using namespace std;const int maxn=2e5+5;int cnt,n,m,update[maxn],dis[maxn],vis[maxn],head[maxn];struct edge{ int to,v,nxt;}G[maxn<<2];void add(int x,int y, int z)原创 2020-07-24 20:18:20 · 197 阅读 · 0 评论 -
【差分约束+floyd】P2474 [SCOI2008]天平
这道题不再是差分约束的模板了(看了题解才有了思路)首先可以根据题意知道,对于每对A、B,我们可以枚举C和D,去满足三种条件A+B>C+D A-C>D-B 转化成差分约束的形式然后我们可以记录maxi[i][j] 和 mini[i][j] 分别表示a[i]-a[j]的最大值和最小值这样对于输入的四种关系可以做出如下处理a[i]>a[j] <==> 1a[i]-a[j]2a[i]=a[j] <==> 0a[i]-a[j]0a[i].原创 2020-07-24 19:01:02 · 121 阅读 · 0 评论 -
【最短路】 Johnson 算法
Johnson 算法这个算法可以用于处理稀疏图,带有负权的任意两点间的最短路问题如果点数 边数 ,那么堆优化的dij就可以解决了但是dij中不能存在负的边权,所以我们要考虑一种转化边权的方法可以通过类似差分约束的方法来重构边权对一条边 u,v ,他们的权值为e ,dis[i]表示1-i的最短路我们可以得到dis[v]-dis[u]+e0因此就可以把变成dis[v]-dis[u]+e增设一个超级源点S,由S向各点连一条权值为0的边,然后使用spfa求出点S到所有点的最短路dis原创 2020-07-23 13:40:48 · 445 阅读 · 0 评论 -
【最短路】P3385 【模板】负环
spfa判负环,记录每个点用于更新的次数,若该次数大于等于n次,就意味着出现了负环#include<bits/stdc++.h>using namespace std;int t,n,m,cnt,flag;const int inf=0x3f3f3f3f;int head[2005],update[2005],vis[2005],dis[2005];struct edge{ int to,v,nxt;}G[6005];void add(int x,int y,int.原创 2020-07-23 08:00:07 · 182 阅读 · 0 评论 -
【最短路+记忆化搜索】P3953 逛公园
首先,可以通过spfa求出最短路以及dis[i](表示1-i的最短路),然后考虑可以多走的距离为k,那么我们就可以枚举这一条边是否能被走,如果这条边连接i和j,那么就可以算出走这条边比原来最短路多走的距离为边权G[i].v-(d[i]-d[j]),然后就可以进行记忆化搜索,求总的方案tips:这道题由于数组较大、T组数较多,用memset初始化会T两个点代码#include<bits/stdc++.h>using namespace std;int t,n,m,k,p;.原创 2020-07-22 21:10:44 · 132 阅读 · 0 评论 -
【最短路+dp】P1772 [ZJOI2006]物流运输
这道题目由于观察到边数和节点数都较少,所以求最短路的方式就有很多(选择了spfa)可以先用次spfa求出path[i][j] 即i-j天的最短路然后就利用dp dp[i]表示前i天的最短路和,递推公式为dp[i]=min(dp[i],dp[j]+path[j+1][i]*(i-j)+k) j为0-i-1代码#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;int n,m,k,e,d.原创 2020-07-22 15:50:33 · 156 阅读 · 0 评论 -
【Floyd】P1119 灾后重建
这道题通过floyd算法的思想,就是枚举点k,用于更新两点之间的距离。就是每次利用新修复的城市节点去更新两点之间的最短路#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;const int maxn=205;int.原创 2020-07-22 13:34:25 · 78 阅读 · 0 评论