最短路
l
mfy的1号小迷弟
一个没有对象的野指针qaq
展开
-
洛谷P1073 [NOIP2009 提高组] 最优贸易(分层图+最短路)
洛谷P1073 [NOIP2009 提高组] 最优贸易(分层图+最短路)题意:带点权的有向图,每个点的点权表示,在该点购买或者卖出水晶球的价格。求从1到n,选择在一点购买水晶球,再选择在一点卖出水晶球后的最大收益。一个点可以多次经过。思路:方法一:缩点+dp(拓扑排序)方法二:分层图+最短路:图片来源每层边权为0,连接第一层的点到第二层的点的权值为点权的负数,表示在该点购买,连接第二层的点到第三层的点的权值为点权的正数,表示在该点卖出因为有负权,只能跑spfa...原创 2021-07-16 10:42:26 · 154 阅读 · 0 评论 -
牛客:飞行路线(分层图+最短路)
牛客:飞行路线(分层图+最短路)题意:一个带边权的图,求从s到t的最短距离,可以忽略k条边的权值。2<=n<=10000,1<=m<=50000,0<=k<=102<=n<=10000,1<=m<=50000,0<=k<=102<=n<=10000,1<=m<=50000,0<=k<=10思路:因为k很小,可以想不 到分层图,把原图看成k层,每层完全一样,再建新边把每层连起来,对于第一层的从原创 2021-07-16 10:30:16 · 252 阅读 · 0 评论 -
洛谷P6822 [PA2012]Tax(最短路+边变点)
洛谷P6822 [PA2012]Tax(最短路+边变点)题意:给出一个 n 个点 m 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 1到点 n 的最小代价。起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权。思路:暴力出奇迹,把所以的边看成点,若a->b,b>c,这将这两条边看成点连起来,最后建立超级源点S,于与1相连的点连起来,权值为0,建立超级汇点T,于与n相连的点连起来。共m^2条边。考虑优化:1.对于一个点,我们把它的出边从小到原创 2021-07-11 10:44:17 · 153 阅读 · 1 评论 -
Dijkstra(最短路输出路径)
//时间复杂度O(n^2) #include<iostream>#include<cstring>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1e3+5;int n,m,mp[maxn][maxn],dis[maxn],pre[maxn];//pre存前驱节点,用来输出路径bool vis[maxn];char s,t;void Dijkstra(int st){ memset(vis,0原创 2021-06-28 21:29:17 · 775 阅读 · 0 评论 -
19银川:道路与航线(连通块+dij+拓扑排序)(SLF优化的SPFA模板)
农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查。他想把牛奶送到 T 个城镇,编号为 1∼T。这些城镇之间通过 R 条道路 (编号为 1 到 R) 和 P 条航线 (编号为 1 到 P) 连接。每条道路 i 或者航线 i 连接城镇 Ai 到 Bi,花费为 Ci。对于道路,0≤Ci≤10,000;然而航线的花费很神奇,花费 Ci 可能是负数(−10,000≤Ci≤10,000)。道路是双向的,可以从 Ai 到 Bi,也可以从 Bi 到 Ai,花费都是 Ci。然而航线与之不同,只可以从 Ai原创 2021-04-05 16:44:22 · 93 阅读 · 0 评论 -
SPFA双端队列优化
#include <iostream>#include <cstdio>#include <cstring>#include <deque>#include <algorithm> const int maxnode = 1e4+3;const int maxedge = 5e5+3;#define INF 2147483647 using namespace std;deque<int> Q;int first原创 2021-03-09 22:26:15 · 166 阅读 · 0 评论 -
最短路 + 二分
POJ3662Telephone Lines题意:从1到n,使第k+1大的路径尽可能小思路:二分找第k+1条电话线的长度d,用该长度d跑最短路算法,若最短路上的线路长度>=d的总数大于k+1,则该长度过短,反之过长,若最后无法找到则为-1,长度都可行则为0#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<cstring>us原创 2021-03-09 18:21:02 · 126 阅读 · 0 评论 -
传递闭包floyed
POJ3660 Cow Contest题意:N个选手,如果A比B强,B比C强,则A必比C强。告知若干个强弱关系,问有多少人的排名可以确定思路:设x个人比你强,y个人比你若,则当x+y==n-1时,才可以确定你的排名#include<iostream>#include<cstdio> using namespace std;const int inf=1e9;const int maxn=1e3+5;int mp[maxn][maxn],ans,n,m,x,y;int原创 2021-03-09 14:33:53 · 103 阅读 · 0 评论 -
【模板】第K短路
#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;struct edge { int v, w, next;} e1[100010], e2[100010];int head1[1010], head2[1010], tot; int n, m, k;int dis[1010];bool vis[1010];原创 2021-03-07 22:08:56 · 68 阅读 · 0 评论 -
平面图最小割 + 最短路做法
最小割:首先最小割在本题时可以这样感性理解:上图是一个你同学在钢铁厂打出来的一个铁架子。你把start处用手捏起来,end处自然垂下。用一个剪刀钳把这个铁架子拦腰剪成两半。如果剪成好几瓣(掉下来有好几个联通块的),那么显而易见,不如剪成两半(把刚才几个剪断的地方原样拼起来变成两个联通块)。我们把三角形看成是点,黑色的边看成是连接三角形的边,那么剪成两半的意思是……在三角形点的图上找一条从左下到右上的最短路径!沿着这条路径剪开就行了。具体思路技巧:把点与点连边转化为,面与面的连边。及把平面图转化为对偶原创 2021-03-07 21:14:09 · 339 阅读 · 0 评论 -
最短路+必须经过n个点+暴力排列组合
HDU3768最短路+状压DPn<=10,考虑next_permutation()枚举所有情况#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=1e9;const ll mod=1e9+7;const int maxn=1e6;const int N=1e5+5;int head[maxn],to[maxn],nex[maxn],vis[N],x,y,t,n,m,k,n原创 2021-03-07 14:42:41 · 434 阅读 · 0 评论 -
次短路 + 统计路径数
HDU1688题目:统计最短路,及次短路的路径数对于每次更新:1.新路径比最短路径长度要小,那么最短路和次短路的长度和次数都要更新。2.新路径等于最短路的长度,那么只需要更新最短路的条数。3.新路径比最短路要长但是比次短路要短,那么需要更新次短路的长度和条数。4.新路径等于次短路径的长度,那么只需要更新次短路径的条数。#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=1e9原创 2021-03-07 13:16:00 · 118 阅读 · 0 评论 -
第K短路
洛谷P2865次短路1.dist[ i ][ 0 ]表示到点 i 的最短路 , dist[ i ][ 1 ]表示到点 i 的次短路2.最短路更新:dist[ i ][ 0 ] > len(j) + val( j , i )次短路更新:dist[ i ][ 0 ] < len(j) + val( j , i ) < dist[ i ][ 1 ](len[j]表示从起点 s 到 j 点总距离)#include<bits/stdc++.h> using namesp原创 2020-11-04 22:35:25 · 76 阅读 · 0 评论 -
最短路 + 逆向思维 + 字典序最小
洛谷:过路费题意:无向图,每个点由大小写组成,大写字母代表城镇,经过需要缴纳(ceil)SUM/20(ceil)SUM / 20(ceil)SUM/20费用,小写字母代表村庄,经过需要缴纳111费用。已经到达目的地点TTT,需要运送到的货物,求从起点SSS需要带的货物的最小值,并输出字典序最小的路线(起点SSS没有过路费,目的地TTT有)思路:从T开始,往S跑,权值为当前点的过路费,输出字典序最小只要加个特判(见代码)BUG: 思路,范围#include <bits/stdc++.h>原创 2020-12-09 15:01:13 · 173 阅读 · 0 评论 -
最短路径树 + 删边
洛谷:战争和物流题意:nnn 个点,mmm条边的无向图,令disdisdis为每对结点的最短路长度的和。例如n=2n=2n=2时,dis=d(1,1)+d(1,2)+d(2,1)+d(2,2)dis=d(1,1)+d(1,2)+d(2,1)+d(2,2)dis=d(1,1)+d(1,2)+d(2,1)+d(2,2)。现在要求删除一条边后,使得新的dis值dis’最大。其中不连通的两点的最短路长度为LLL(注意有重边)思路:先求出以每个点为源点的最短路径树,再枚举删除每条边后,判断对每个源点的最短路径原创 2020-12-07 22:12:44 · 458 阅读 · 0 评论