最短路
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
Commuter Pass
题目链接:Commuter Pass显然我们一定会走 s 到 t 的一条路径,正着走或者反着走。所以可以在最短路上dp,当前没走过上面的路径,正这正着走,正在反着走,已经走完了。4个状态的最短路。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10,M=4原创 2021-07-02 19:17:18 · 277 阅读 · 0 评论 -
佳佳的魔法药水
题目链接:佳佳的魔法药水看成一瓶药水要另一个药水的最短路,然后边权也是药水即可。因为要求方案数,所以我们更新的时候,保证作为边权的药水已经是最短的即可。然后要注意两瓶相同药水合成的情况。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1010;int n,原创 2021-06-28 13:01:31 · 247 阅读 · 0 评论 -
Reboot from Blue
题目链接:Reboot from Blue考虑最短路,每个点只会连左右第一个小于本身的点。然后用单调栈维护即可。AC代码:#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10,M=N*2;int n,ss,tt,pos,pos1,dp[N],deg[N];pair<int,int> a[N];int head[N],nex[M],to[M],w[M],原创 2021-06-25 12:01:04 · 119 阅读 · 1 评论 -
Telephone G
题目链接:Telephone G因为此题DP的时候,转移成环,所以我们可以考虑最短路模型。我们对于这种绝对值距离,我们可以想到对相邻点建边权为1的边来解决。但是考虑种类问题。我们可以建立分层图,第0层为原图,第 1->k 层代表每种颜色,相邻边权为1,然后如果颜色相同则可以到达原图。最后因为边权只有0和1,01BFS即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h&g原创 2021-01-30 16:55:23 · 163 阅读 · 0 评论 -
Codeforces - E. Minimum Path
题目链接:Codeforces - E. Minimum Path不难发现其实就是最大边权变成0,最小边权变成2倍。我们可以假设是可以有一条边免费走,且有一条边要走2倍的一个最短路。其实就是一个分层图或者最短路上dp。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N原创 2021-01-16 14:42:06 · 196 阅读 · 0 评论 -
老奶奶参加宴会
题目链接:老奶奶参加宴会对于新加的边,显然不能n*n的复杂度去加,我们可以对值排序,然后相邻点连接即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=3e5+10,M=N*5;int n,m,a[N],s,t,id[N],vis[N],d[N],p[N];in原创 2020-11-25 18:07:02 · 298 阅读 · 0 评论 -
爬爬爬山
题目链接:爬爬爬山显然能够到达的最高地方为 a[1] + k ,然后大于的都需要降低到 a[1] + k ,因为上下是可以抵消的。所以每次和 a[1] + k 判断即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=2e5+10,M=N*2;int n,m,a[原创 2020-11-15 20:22:52 · 129 阅读 · 0 评论 -
Codeforces - Graph Transpositions
题目链接:Codeforces - Graph Transpositions显然如果改变的次数很多的话,那么我们一定是改变的次数越少越好。如果改变次数很少才可能是 用多改变几次,然后少走一些距离。然后判一下最小的改变次数即可。并且求出在最小改变次数下的最小距离。如果改变次数很小直接dp即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int l原创 2020-11-03 20:59:54 · 276 阅读 · 0 评论 -
Codeforces - Three States
题目链接:Codeforces - Three States假设是1号点到2和3。那么我们可以枚举公共路径的位置。然后分叉。然后就是一个01最短路预处理了。BFS即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e3+10;const int dx[原创 2020-09-04 12:31:02 · 174 阅读 · 0 评论 -
Codeforces - President and Roads
题目链接:Codeforces - President and Roads判断YES的情况,直接用最短路计数判断即可。对于CNT的情况判断和最短路的差值,示范法能被减掉即可。其他情况就是NO注意,codeforces卡单模数,所以可以用随机模数。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace原创 2020-09-03 10:05:18 · 194 阅读 · 0 评论 -
URAL - 1651
题目链接:URAL - 1651因为边有访问顺序,所以我们可以采用动态加边的方式。也就是按照顺序枚举每一条边,是否会更新下一个点。但是注意我们要输出方案,所以我们应该是对每个编号存上一个转移点的位置。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+1原创 2020-08-22 22:04:44 · 214 阅读 · 0 评论 -
牛客练习赛67
题目链接:牛客练习赛67A:模拟,注意全0的情况。#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;string str;int ch(char c){return c<'0'||c>'9';}void solve(){ int ok=0,st=0;; for(int i=0;i&原创 2020-08-14 22:48:50 · 222 阅读 · 0 评论 -
HDU - 5669
题目链接:HDU - 5669区间之间连边用线段树或者倍增优化即可。然后k次机会可以建立分层图,或者直接dp。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=5e5+10,M=4e6+10;int n,m,k,d[N][15],vis[N][15],res,原创 2020-08-12 12:51:57 · 218 阅读 · 0 评论 -
HDU - 6290
题目链接:HDU - 6290对判断是否能走,我们可以发现等级越低,越能过去。然后判断消费:假设每次经过的边的等级提升值分别为:a1,a2,a3…ak我们可以发现代价为:log2(1+a1+a2+a3+…+ak),也是等级越低越优,所以我们对等级跑最短路即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing name原创 2020-08-04 11:50:43 · 205 阅读 · 0 评论 -
地铁
题目链接:地铁因为对点跑最短路很难判断是否是同一条地铁转移而来, 所以我们可以对边跑最短路。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10,M=N<<2;int n,m,d[M],res;int head[N],nex[M],to[M]原创 2020-07-24 18:01:32 · 276 阅读 · 0 评论 -
Journey from Petersburg to Moscow
题目链接:Journey from Petersburg to Moscow如果经过边数小于等于k条边,那么答案就是1到n的最短路。否则我们可以枚举第k 大的值是多少,然后小于的置为0,这样可能会导致走的大于0的值小于k条,那么我们转化一下,将大于的边权都减去当前枚举的值,然后最后加上k*枚举的值。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int l原创 2020-07-16 12:58:49 · 285 阅读 · 0 评论 -
Fine Dining G
题目链接:Fine Dining G把经过食物看成一条负权边,那么就是经过一次食物的最短路是否小于等于不经过的最短路。建立分层图即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10,M=2e6+10;int n,m,k,d[N];int head原创 2020-07-15 10:15:27 · 266 阅读 · 0 评论 -
Shortcut G
题目链接:Shortcut G首先因为是最小字典序的最短路,所以最短路树是确定的。然后我们可以发现最优解一定是从1连向某个点,可以反证。然后枚举到每个点即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e4+10,M=1e5+10;int n,m,len原创 2020-07-14 18:41:36 · 251 阅读 · 0 评论 -
Why Did the Cow Cross the Road
题目链接:Why Did the Cow Cross the Road显然我们每个点只有3种状态,走的步数%3分别为0,1,2的值。然后就可以跑最短路了,dp[i][j][s]为当前在点(i,j),走过的步数状态为s的值。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const i原创 2020-07-10 23:46:32 · 490 阅读 · 0 评论 -
墨墨的等式
题目链接:墨墨的等式显然我们对%a[1]得到每个能到的最小值,然后再用a[1]递加上去即可。得到能到的最小值跑同余最短路即可。但是要注意计算的时候比如计算x,那么要d[i]<=x才能计算。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=5e5+10;in原创 2020-07-06 11:12:59 · 222 阅读 · 0 评论 -
Sums
题目链接:Sums我们让a[1]为模数,然后用a[2]->a[n]来构造%a[1]的每个数的最小值。然后直接看d[x%a[1]]<=x,那么就是有解的。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=5e4+10;int n,a[N],d[N],原创 2020-07-05 23:08:07 · 317 阅读 · 0 评论 -
「JOI 2015 Final」JOI 公园
题目链接:「JOI 2015 Final」JOI 公园显然我们枚举的X只可能是最短路上面的值。然后我们知道小于X的点的个数,然后我们再找到有多少边是要翻修的,所以我们可以发现要翻修的边其实就是 max(d[u],d[v])>x的边。然后我们枚举每个d即可。之后可以二分找到对应的翻修的边,或者直接利用单调性做。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#de原创 2020-06-02 12:22:41 · 439 阅读 · 0 评论 -
Interplanetary
题目链接:Interplanetary显然询问具有单调性,所以我们可以离线来做。把点的温度排序。然后就变成每次增加一个点,然后快速更新任意两点之间的最短路,因为n很小,所以直接floyd即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=410,M=1e5原创 2020-05-22 14:23:42 · 279 阅读 · 0 评论 -
.. (Double Dots)
题目链接:…(Double Dots)如果学过最短路径树,那么就是很显然的题目了。因为一张图必存在最短路径树,所以只要图连通就一定有解,否则输出每个前驱顶点即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int n,m,d[N],pre[原创 2020-05-18 09:18:18 · 253 阅读 · 0 评论 -
小明爱换钱
题目链接:小明爱换钱显然是一个最短路模型。首先离散化所有点,然后按照给的n个关系连边。不过点还可以到更小的点,然后执行小的点的关系。所以我们建立一条大到小的道路。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longus...原创 2020-05-04 16:49:49 · 354 阅读 · 0 评论 -
Metropolis
题目链接:Metropolis显然可以二进制分组,然后跑最短路。不过复杂度是两个log 的,会TLE。但是其实我们分析每一条边,如果这条边的两个端点,被不同的大都会更新,那么我们就可以去更新那两个大都会的答案。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#d...原创 2020-05-04 10:50:01 · 297 阅读 · 0 评论 -
Pizza Delivery
题目链接:Pizza Delivery提前预处理1到所有点的最短路和所有点到2的最短路。首先对于一条边,如果反转之后变小,直接判断即可。如果不变小,那么如果不存在与最短路上面,不变。如果存在于最短路上面,我们把单向边看成双向,并且这个边是桥,那么变大。否则不变。Ac代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#inc...原创 2020-04-29 17:12:11 · 820 阅读 · 0 评论 -
小雨坐地铁
题目链接:小雨坐地铁拆点做一做就行了,把每个公司的地铁线分开。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+10,M=2e6+10;int...原创 2020-04-21 20:28:01 · 248 阅读 · 0 评论 -
函数的魔法
题目链接:函数的魔法显然我们可预处理出小于233的两两之间最短路,然后暴力判断。如果a大于233,需要先变小成f(x)或者g(x)AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace st...原创 2020-04-16 14:09:05 · 232 阅读 · 0 评论 -
汽车加油行驶问题
题目链接:汽车加油行驶问题不知道为什么要费用流,直接最短路即可。因为有油量这个东西,我们可以建分层图。其实没必要建图,因为只能上下左右走。对每个点讨论一下即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longus...原创 2020-04-10 10:16:34 · 122 阅读 · 0 评论 -
拯救小tim
题目链接:拯救小tim按时间分层。然后因为答案是 ed-st,所以最开始我们把s的每一层的点都放到队列当中,且d[now]=0.然后spfa或者Dijkstra即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long long...原创 2020-04-08 09:45:39 · 187 阅读 · 0 评论 -
P2384 最短路
题目链接:P2384 最短路显然对于乘积,我们可以通过对数来得到。但是现在到n的最短路为小数,怎么变回去呢?其实我们只需要用小数求出最短路具体是哪一条即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing...原创 2020-04-06 21:20:35 · 226 阅读 · 0 评论 -
BZOJ - 4398
题目链接:BZOJ - 4398只要不是与1相连的边,一定不会走多次。显然。所以我们其实是选一个点,1从这个点出去,然后从另一个点进来。所以我们对与1相邻的点二进制分组即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long l...原创 2020-04-04 23:46:48 · 196 阅读 · 0 评论 -
抓住czx
题目链接:抓住czx按照时间排序之后,枚举每一个点即可。这个点什么时候是有贡献的呢?到这个点的时间小于走的时间。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const in...原创 2020-03-29 21:54:25 · 241 阅读 · 0 评论 -
行路难
题目链接:行路难由于是带限制的最短路,所以单独开数组记录会导致状态不对等,所以我们需要用队列维护结构体,并且用数组模拟队列,这样我们才知道当前的上一个状态。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing na...原创 2020-03-29 10:32:54 · 114 阅读 · 0 评论 -
魔法祝福
题目链接:魔法祝福带限制的最短路,但是其实我们可以发现限制是成两层的关系。所以我们记录到这个点的最短路,已经最短路的前提下,最短的边数即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespa...原创 2020-03-28 17:19:03 · 221 阅读 · 0 评论 -
[USACO15JAN]Grass Cownoisseur G
题目链接:[USACO15JAN]Grass Cownoisseur G首先,同一个SCC里面任意可达,里面的点都没区别,故可以缩点。然后,对于有一次反悔的机会,直接建立反悔分层图即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int ...原创 2020-03-23 15:13:41 · 221 阅读 · 0 评论 -
Codeforces - Buy a Ticket
题目链接:Codeforces - Buy a Ticket因为到的点是相同的,所以直接建反边即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=2e5...原创 2020-03-14 11:06:34 · 150 阅读 · 0 评论 -
[SCOI2009]最长距离
题目链接:[SCOI2009]最长距离最开始想太复杂了。其实我们直接枚举从每个点出发,找到所有能到的点,取max即可。什么是可以到达的点呢?我们让石头之间连边为1,否则权值为0。看最短路是否小于T即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#de...原创 2020-03-10 17:39:46 · 230 阅读 · 0 评论 -
すぬけ君の地下鉄旅行
题目链接:すぬけ君の地下鉄旅行显然我们可以记录每个状态前一个状态通过的铁路。然后判断这一次边权值。但是我们不能只用一个状态来记录,因为可能两个状态的dis相等,但是具体用哪个点更新是不确定的。所以我们需要用set去存一下。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h...原创 2020-03-08 17:47:59 · 112 阅读 · 0 评论