![](https://img-blog.csdnimg.cn/20190905201549791.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
最短路
Ray.C.L
不开longlong见祖宗
展开
-
LeetCode 882. 细分图中的可到达结点
最短路原创 2022-11-29 11:41:21 · 115 阅读 · 0 评论 -
AcWing 2019. 拖拉机
思路:求边权为0,1的最短路代码:#include <iostream>#include <cstring>#include <algorithm>#include <deque>using namespace std;const int N = 1010;#define x first#define y secondtypedef pair<int, int> PII;bool g[N][N],st[N][N];.原创 2022-01-07 11:16:24 · 304 阅读 · 0 评论 -
排队布局(差分约束)
思路:根据题意我们可以提取出3个不等式。用xi表示第i头牛的距离1.xb-xa<=l2.xb-xa>=d3.xi<=x(i+1)有第三个不等式可以推出其他所有的边。求最大距离spfa跑最短路吧3个不等式换成xi<=xj+c的形式,第一问满不满足方案数就是判断负环,第二问跑最短路。代码:#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long.原创 2021-02-13 15:46:53 · 146 阅读 · 0 评论 -
区间(差分约束)
思路:区间[a,b]个数不少于C,区间问题我想到前缀和(Si表示从1到i中被包含数的个数),刚好可以组成不等式1.Sb-Sa-1>=c2.S0=0;3.Si>=S(i-1)4.Si-S(i-1)>=1因为题目区间从0出发影响超级源点,那么我们吧给的区间都++,最后就是求dis[50001]。大佬:这不一看就是前缀和不等式吗。我:???咋看的前缀和?代码:#pragma GCC optimize(2)#include<bits/stdc++.h> usin.原创 2021-02-11 12:05:55 · 172 阅读 · 0 评论 -
糖果(差分约束)
差分约束:此图作者yxcls思路:根据题意和差分约束的原理我们可以得出一些不等式关系如下:1.A>=B&&B>=A2.B>=A+13.A>=B4.A>=B+15.B>=A6.x>=17.x>=x0+18.x0=0因为求的是最小值,那么求最长路,建图。求环时可以用栈代替队列进行优化。为了满足源点能到所有边需要把x0对所有点建边。代码:#pragma GCC optimize(2)#include<bits/st.原创 2021-02-10 21:11:21 · 203 阅读 · 0 评论 -
单词环(01分数规划,判断正环)
思路:根据题意我们吧前2个字母和后2个字母做一个映射然后建边,边权w为字符串长度,题目要求∑w[i]/∑1\sum w[i]/\sum 1∑w[i]/∑1最大我们二分答案Mid如果mid<ans说明可以继续二分,此时可以得到∑w[i]/∑1−mid>0继而得到∑(w[i]−mid)>0\sum w[i]/\sum 1 -mid>0继而得到\sum(w[i]-mid)>0∑w[i]/∑1−mid>0继而得到∑(w[i]−mid)>0以此判断图中是否有个正环满足该条件.原创 2021-02-09 00:18:52 · 194 阅读 · 0 评论 -
观光奶牛(01分数规划,判断正环)
思路:碰见这种在图上求2个累加和的问题,就二分他的答案看有没有个一个正环满足条件,有题意可以知道若mid>ans,即存在一个环S使得∑f[i]/∑t[i]>mid时,我们可以继续二分,那么可以变形得到∑(f[i]−mid∗t[i])>0,每次加边的更新条件变为t[j]<f[i]−mid∗t[i]若 mid>ans,即存在一个环S使得\sum f[i]/ \sum t[i]>mid时,我们可以继续二分,那么可以变形得到\sum(f[i]-mid*t[i])>0,每次.原创 2021-02-08 19:03:22 · 109 阅读 · 0 评论 -
虫洞(spfa判断负环)
思路:根据题意可以从任意点出发,那么我们只需要判断图中有没有负环就可以知道能否在出发时刻之前回到出发地。代码:#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n').原创 2021-02-07 17:49:58 · 168 阅读 · 0 评论 -
牛站(经过K条边的最短路)
思路:用dis[k][i][j]表示从i到j经过k条边的最短距离,那么dis[a+b][i][j]的转移方程就很容易想出来是dis[a+b][i][j]=min(dis[a+b][i][j],dis[a][i][k]+dis[b][k][j]),我们发现从s到e经过k条边,每次运算都是独立的,可以满足结合律,那么dis[k][i][j]我们就可以不用枚举K选择用倍增(快速幂)去做,初始化g[i][j]表示只经过1条边从i到j的最短距离,然后通过倍增到K算出经过K条边的最短路、代码:#pragma GC.原创 2021-01-30 16:52:21 · 704 阅读 · 0 评论 -
观光之旅(floyd求最小环)
思路:我们发现所有的环都张下图这个样子,我们枚举点对,i,j当i,j固定后,从i到k和从k到j的长度就是固定的,那么我们要环最小,就是求j到i的距离加上前2个距离的最小值,因为要记录路径,在floyd中i,j是由K转移来的,那么从i到j就以k为中间点,记录位置。代码:#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::io.原创 2021-01-29 11:51:38 · 124 阅读 · 0 评论 -
排序(floyd应用)
思路:只有一种关系,我们用这种关系做传递闭包,我们用floyd完成传递闭包运算。然后我们判断点之间的关系,dis[i][j]==1表示i<j关系存在,如果发生矛盾我们判断dis[i][i]是否为1,如果无法判断关系则说明dis[i][j]==dis[j][i]==0,否则关系判断无误。代码:#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#defi.原创 2021-01-25 11:45:57 · 174 阅读 · 0 评论 -
牛的旅行(Floyd应用)
思路:根据题意我们要求牧场中最短路最长的是多少,首先如果只有一个牧场那么我们只需要跑一遍最短路然后,求各个点直接的最短距离最长是多少,我们用mxd[i]表示i点到其他点的最短距离最长是多少。如果需要连接牧场的话,我们就要枚举牧场之间的连接点,当dis[i][j]==inf时说明可以连边,此时我们找连边尽可能小的使得mxd[i]+dis[i][j]+mxd[j]尽可能小,最后看这2个哪个大就是要求的直径。#pragma GCC optimize(2)#include<bits/stdc++.h&g.原创 2021-01-24 20:37:13 · 330 阅读 · 0 评论 -
观光(统计最短路,次短路条数)
思路:问最短路和次短路的条数和,并且次短路只比最短路多1,我们在dijkstra时进行统计和更新,用dis[i][0]表示到i点的最短距离用dis[i][1]表示到i点的次短距离,用cnt[i][0]表示到i的最短路径的条数,用cnt[i][1]表示到i的次短路径条数,当我们到 i 点最短路需要更新时,那么原来到 i 的最短路就会变成次短路,先更新一下次短路的距离,此时到 i 次短路的条数也是就变成了之前到 i 的最短路条数,然后我们再更新最短路的距离,最短路的次数也更新,当我们发现和最短路距离相同则我们.原创 2021-01-23 22:36:14 · 171 阅读 · 0 评论 -
拯救大兵瑞恩(最短路,状态压缩)
思路:要找到到达N,M点的最短距离,当有门时需要用对应的钥匙开门,那么我们用dis[i][j]表示在编号i位置时此时持有钥匙的状态是j的最短距离。根据钥匙的编号id我们初始化Key的状态为Key=1<<id-1 ,我们可以发现当该位置有钥匙时,我们的状态就要发生改变state=state(原)|key然后看是否需要更新dis可得转移方程dis[i][state]=dis[i][state(原)|key],然后就是上下左右移动,在移动时我们需要判断有门的情况,当有门时,我们要判断在该位置上我们此.原创 2021-01-22 14:06:45 · 262 阅读 · 0 评论 -
选择最佳线路(建立虚拟源点)
思路:问你从多个源点出发到终点的最短路线,那么我们建立一个虚拟源点和其他车站连起来权值为0,求从这个虚拟源点到终点的最短路(记得初始化tot)。代码:#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#defin.原创 2021-01-21 11:43:39 · 6913 阅读 · 0 评论 -
最优贸易(最短路)
思路:我们要求的是最大差价,那么比如我们在K处交易那么就是从1到K期间我们买入最低价格的水晶球,从K到N我们以最高价格卖出。那么我们就从1-N跑一次最短路,最短路更新条件是水晶球的最低价格,然后从反向从K-N跑一遍最短路,更新条件是水晶球的最贵价格。然后枚举K算出最大差价#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::io.原创 2021-01-21 10:36:13 · 256 阅读 · 0 评论 -
通信线路(二分+最短路)
思路:从题意可以看出是求在一个从1——N的路径从第k+1条边的最大值最小,一看这最大值最小想到二分,我们发现答案可能是0(当1-n的路径经过的变数小于等于K时)也可能是没有解-1。所以我们二分时从0——1e6+1起,如果答案是1e6+1说明无解,然后我们不断二分出第K+1条边权x,然后在原图跑最短路,根据题意我们可以吧大于x的边权视为1,其他是0,这样我们就能知道当第k+1条边的权值为x时,有没有大于x的边数小于等于K,如果有说明我们的x还能往小继续二分。知道求出最优解。代码:#pragma GCC .原创 2021-01-18 19:38:36 · 341 阅读 · 1 评论 -
新年好(最短路+dfs)
思路:先用最短路预处理一下去亲戚家的最短距离,然后暴力搜索最短的拜访顺序。#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n')#define lson root&.原创 2021-01-16 16:13:54 · 205 阅读 · 0 评论 -
电路维修(0,1距离最短路)
思路:根据题意我们发现是求最短路,我们可以发现当可以直接到达的点权值为0,不能直接连接的点需要旋转才能连接的权值为1,那么我们再BFS时,看一下我们的下一跳的点,在图中的状态是什么样的,遍历顺序已经对应状态如下图,如果此时下一跳和电路的状态可以对应那么权值是0,否则权值是1,可以发现当答案处于奇数点(行+列%2=1)时是不可能到达的//#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef.原创 2020-12-02 23:26:56 · 302 阅读 · 0 评论 -
昂贵的聘礼(最短路,建立超级源点)
思路:我们建立以个超级源点,源点到没个物品的价值代表直接购买,然后根据兑换方式进行建图,为了保证在等级限制内,因为我们必定要换到1号物品,所以就枚举从1号物品等级-m到1号物品的等级区间跑最短路#include<bits/stdc++.h>#define re registerusing namespace std;typedef long long ll;const double eps=1e-7;const int INF=1e9;const int N=105;int ..原创 2020-11-08 14:53:50 · 280 阅读 · 1 评论 -
最优乘车(最短路)
思路:对于按顺序给出的车站建图,如样例中4可以到7 3 6,7可以到 3 6,3可以到6这样建立有向图,然后找到从1号点到m号点的最短距离,同一题线路的距离都为1,问的是换乘次数那么最后答案-1//#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define spa.原创 2020-11-07 22:24:20 · 532 阅读 · 0 评论 -
香甜的黄油(最短路)
思路:最短路暴力,吧糖放到每个位置然后跑一下最短路,看从当前位置到几个有牛的位置的距离是多少记得乘牛的数量,取最小值//#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('.原创 2020-11-07 16:13:49 · 294 阅读 · 0 评论 -
信使(最短路)
思路:要最短时间全部吧信送完就是找最短路中最长花费的时间是多久//#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n')#define lson root<&.原创 2020-11-07 15:32:57 · 411 阅读 · 0 评论 -
道路和航线(SPFA优化,拓扑排序+迪杰斯特拉)
思路:SPFA的优化#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200005;const int mod=1e9+7;const int M=(1<<10)+5;const int inf=0x3f3f3f3f;int n,T,R,S;struct node{ int to,nex,w;}edge[N];int head[N],tot,dis..原创 2020-09-14 20:17:29 · 176 阅读 · 0 评论 -
旅行(最短路暴力)
思路:找经过三个点的最短路最长,我们枚举每一个中转点,以这个中转点为起点跑最短路,在从大到小排序找到2个路径,不断更新。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>//#include<bits/stdc++...原创 2020-08-04 14:21:55 · 142 阅读 · 1 评论 -
追债之旅(最短路)
思路:根据题意我们再最短路加一维dis[i][j]表示从1-i经过j天的最小价值。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>#include<queue>#include<bits/stdc++.h>using namespace .原创 2020-07-18 11:59:54 · 231 阅读 · 0 评论 -
小雨做地铁(最短路+分层图)
思路:我们吧建立m+1层分层图,第m+1层是起点和终点所在,吧他叫做虚点,第i层的第x个点,吧他设为i*n+x,从虚点前往前m层图就是乘坐地铁线的钱为ai,从其他点前往虚点花费是0,每层的虚点之间花费是bi,跑一遍最短路#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector>.原创 2020-07-18 10:19:53 · 184 阅读 · 0 评论 -
Rinne Loves Graph(最短路+DP)
思路:平时的最短路dis[i]表示从1-i的最短路是多少,那么题设添加了一个条件我们也多一维dis[i][j]表示从1-i穿过j次警戒的最短路,在跑最短路的时候判断一下是否超过K次,最后在dis[n][1-k]遍历一遍找最小值#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<iostream>#include<vector..原创 2020-07-17 16:25:35 · 232 阅读 · 0 评论 -
Acwing 852. spfa判断负环
思路:用SPFA判断负环,如果加边大于等于N说明有负环。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<bits/stdc++.h>using namespace std;typedef long long ll;...原创 2020-05-05 12:28:03 · 194 阅读 · 0 评论 -
Acwing851(SPFA求最短路)
思路:SPFA#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<bits/stdc++.h>using namespace std;typedef long long ll;#define space putchar...原创 2020-05-04 10:31:14 · 269 阅读 · 0 评论 -
有边数限制的最短路(贝尔曼福特)
思路:用贝尔曼福特算法跑K次表示1-所有点经过不超过K条边的最短距离。#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<bits/stdc++.h>using namespace std;typedef long lo...原创 2020-05-02 17:58:39 · 329 阅读 · 0 评论 -
AcWing850(dijskstra优化)
思路:邻接矩阵存图,优先队列存取O(mlogn)#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include<bits/stdc++.h>using namespace std;typedef long long ll;#def...原创 2020-05-01 10:27:51 · 220 阅读 · 0 评论 -
Extended Traffic LightOJ - 1074
题意:给你n个顶点,和m条边,边权计算(终点-起点)的立方,然后要你求最短路,如果不存在这条路或者这条路权值<3,输出?。思路:因为(终点-起点)的立方有可能会出现负数因此我们不但要找最短路还需要判负环,因为有负数dijkstra就用不了了,这里用spfa找负环,用dfs把负环都染色。#include <iostream>#include <cstdio>...原创 2019-10-11 21:05:52 · 190 阅读 · 0 评论 -
Tram POJ - 1847(模板题)
题目大意 :第一行 3 代表图中点的个数,2起点,1终点,下面三行是:第i行的第一个数是与第i个点相连的个数,本行的其他数字就是相连的点,第一个与该点相连的点距离为0,其他的点距离都为1一.弗洛伊德模板#include <algorithm>#include <iostream>#include <cstring>#include <ioma...原创 2019-09-18 17:25:05 · 181 阅读 · 0 评论 -
2019ICPC南京网络Holy Grail
题目翻译作为一个有着悠久历史的巫师家族的现任继承人,不幸的是,你发现自己被迫参加了一场残酷的圣杯战争,这场战争已经转世60年了。然而,幸运的是,你召唤了一个拥有强大的贵族幻影的法师仆人。当你的仆人发射她的贵族时Le Phantasm将构造一个魔域,它实际上是一个由n个顶点和m个边组成的有向图,更具体地说,该图满足以下限制:不具有多条边(对于每对顶点X和Y,图形中这对顶点之间至多有一条边...原创 2019-09-02 21:25:54 · 128 阅读 · 0 评论 -
Invitation Cards POJ - 1511(SPFA最短路)
题意:求点1到其他n-1个点的往返最短路之和此题相当于求两次以点1为起点的最短路,用vector存图#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>...原创 2019-07-31 10:42:52 · 187 阅读 · 0 评论