![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM-图论-最短路
暗金色
这个作者很懒,什么都没留下…
展开
-
LightOJ - 1221 Travel Company(负环)
题目大意:给你N个点,M条边,每条边有相应的 in和out,现在公司要求,找到一个环,使得这个环内的边的in / out > p解题思路:将式子变形,环内的in / out > p,就变成了 0 > 环内的out * p - 环的in,就相当于找到一个负环了#include <cstdio>#include <cstring>#include <queue>using namespace st原创 2015-11-10 00:01:23 · 633 阅读 · 0 评论 -
HDU - 4034 Graph (floyd变形)
题目大意:给出每个点之间的最短距离,问需要几条边才能形成这张图解题思路:100个点,果断floyd,接着判断 如果dp[i][j] > dp[i][k] + dp[k][j]表示这张图构建不了,因为最短路冲突了 如果dp[i][j] == dp[i][k] + dp[k][j],就表示ij这条路可以被ik和kj取代,那么这条路就可去掉了 去掉的路记得标记。。。WA了好多次#include <c原创 2015-08-01 00:33:27 · 675 阅读 · 0 评论 -
LightOJ - 1174 Commandos(floyd)
题目大意:给你N个点,M个人(M>N),要求这些人同时从点S出发,走到点T,其间M个人要经过所有的点,问需要的最短时间解题思路:floyd求出 S到任意点的距离和任意点到T的距离,接着找出最大的dp[S][i] + dp[i][T]即可#include <cstdio>#include <cstring>#include <algorithm>using namespace std;cons原创 2015-11-10 21:11:13 · 709 阅读 · 0 评论 -
BellmanFord判环算法
转自 http://blog.csdn.net/niushuai666/article/details/6791765Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝转载 2015-09-16 16:59:06 · 667 阅读 · 0 评论 -
UVA - 10269 Adventure of Super Mario spfa+floyd
题目大意:有A个村庄,B个城堡,村庄的序号为1---A,城堡的序号为A----A+B,马里奥有一双魔法鞋子,可以瞬移K次,魔法鞋子可以让他在两点之间的距离解题思路:先用floyd求出两点间的最短距离,再用spfa算出最短距离,这里的d数组要变成二维的,d[i][j],i表示点,j表示使用了魔法鞋子的次数,d[i][j]就表示从点i到点A+B使用了j次魔法鞋子的最短距离,这时候判断就要有两个,一原创 2014-12-13 10:32:41 · 578 阅读 · 0 评论 -
UVA - 10048 Audiophobia floyd的变形
题目大意:给出一张图,从起点走到终点,要求走的路程中路的权值的最大值达到最小解题思路:floyd算法变形,设dp[i][j]为从i到j的权值的最大值的最小值,则dp[i][j] = min(dp[i][j],max(dp[i][k],dp[k][j])),dp[i][k]和dp[k][j]必须是连通的,这题相当于是DP题;}#include#include#includeusin原创 2014-12-03 08:14:17 · 593 阅读 · 0 评论 -
UVA - 567 Risk flody算法
#include#include#includeusing namespace std;#define maxn 25#define INF 0x3f3f3f3fint g[maxn][maxn];int main() { int num,temp,mark = 1; while(scanf("%d",&num) != EOF) { printf("Test Set #%d\原创 2014-11-18 23:04:16 · 673 阅读 · 0 评论 -
UVA - 10986 Sending email 最短路的spfa算法
题目大意:有n个服务器,m条线将其连接起来了,要求将信息从s服务器送到t服务器,求最短的时间,如果送不到的话,另外输出解题思路:这题的数量比较大,用邻接矩阵的话会暴,所以用邻接表来表示,具体思路不变#include#include#include#includeusing namespace std;#define maxn 100005#define INF 0x3f原创 2014-12-03 22:56:26 · 855 阅读 · 0 评论 -
UVA - 558 Wormholes 负环
题目大意:两个星系之间有虫洞相连,每个虫洞都有一个权值,正的表示能到未来,负的表示会回到过去,有一个科学家想要回到过去取观看宇宙大爆炸,所以他要求你找出虫洞是否能形成负圈,如果有负圈的话就能回到过去了解题思路:找负圈的话,使用spfa算法的话,只要一个点入队的次数大于n的话,就表示存在负圈了#include#includeusing namespace std;#define max原创 2014-12-03 23:05:01 · 689 阅读 · 0 评论 -
UVA - 10803 Thunder Mountain 最短路的最大值
题目大意:有N个乡村,如果乡村间的距离大于10的话就表示两乡村之间不能直接连通,求连通的乡村中,两个乡村间的最大距离是多少解题思路:将距离大于10的乡村间的距离设置为INF,再用floyd求出乡村间的最小值,接着取最大值即可#include#include#include#includeusing namespace std;#define maxn 105#define IN原创 2014-12-04 23:51:34 · 1136 阅读 · 0 评论 -
UVA - 10985 Rings'n'Ropes 最短路
题目大意:有N个戒指,M条线将N个戒指给连接了起来,线的长度是相等的,一条线只有左右两端有戒指,现在要求取出两个戒指,在线不断的情况下,将戒指往左右两边拉,问在同一水平高度的线最多有几条解题思路:假设每条线的长度为1。两个点之间的线的数量在同一水平高度最多的情况,肯定是距离最短的时候,因为再加长的话,最短状态下的线会断。现在的难题是要统计在两点间有多少的线,将两点间最短距离的状况下所经过的点都原创 2014-12-13 15:47:22 · 694 阅读 · 0 评论 -
UVA - 125 Numbering Paths floyd的变形
题目大意:给出N个城市,要求求出这每个城市之间有多少条道路可走解题思路:floyd算法的思想是DP思想,用f[i][j]表示i到j的值,这个值可以是多种多样的,比如前面的UVA 10048的噪音题f[i][j]就表示从i到j通过的点的最大值的最小值,通过中间节点k来过度,这题的话f[i][j]就表示从i到j有多少条线路可走,转换方程是,当f[i][k] && f[k][j]时,也就是i到j时通原创 2014-12-07 20:29:28 · 643 阅读 · 0 评论 -
HDU 5521-Meeting(最短路)
题目大意:有N个点,两个人,其中一个人住在点1,另一个人住在点n 有M个点集,集合内的数表示任意两点的距离为dis 现在问,如果两个人要见面,需要最短距离是多少,有哪几个点能被当成见面点解题思路:分别对两个点进行最短路,但是不能直接最短路,这里有一个问题是,边太多了 其实也不会很多,每个点集只能被松弛一次,因为里面所有的点已经是最短的状态了,理解这个就可以做了#include <cstdio>原创 2015-11-01 00:07:03 · 2305 阅读 · 1 评论 -
UVALive - 3661 Animal Run (平面图+最小割+对偶图+最短路)
题目大意:有很多只小动物要从左上角跑到右下角,给出每条线路所需的人手,问至少需要多少人手,才能将所有动物抓住解题思路:最小割,就是最小割,但是用最大流处理不了,边太多了 具体可以参考算法合集之《浅析最大最小定理在信息学竞赛中的应用》 知道了这个后,这题估计就可以解了 给出我的建图方式 将每一个小三角形从左往右,从上到下依次编号为1-2-3。。 每行的同一个三角行的编号差就是2 * (m -原创 2015-08-06 12:02:00 · 998 阅读 · 0 评论 -
LightOJ - 1254 Prison Break(最短路+大剪枝)
题目大意:给你每个加油站加一升油需要的费用和一张地图。 现在有Q个询问,询问的是当车的油箱容量为C时,从S到T所需要花费的最少钱解题思路:还是多维最短路,用dp[i][j]表示到达i点时,油箱里还剩有j升油时的最小花费,这里有一个剪枝,就是如果到达那边时,费用比上次到达时还大的话,就不用更新后面的了 这里用的是Dijkstra,所以只要走到终点了,不管油箱还有多少油,都表示最小费用了#inclu原创 2015-11-10 21:17:54 · 1255 阅读 · 0 评论 -
LightOJ - 1281 New Traffic System(二维最短路)
题目大意:给你N个点,M条已有的边,K条可以添加的边,K条中最多只能选择D条,问0到N-1的最短路解题思路:二维最短路,多开一维存储走到该点已经选择了多少条边了#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int N = 10010;cons原创 2015-11-10 21:13:31 · 972 阅读 · 0 评论 -
UVA - 104 Arbitrage floyd的最初形式
题目大意:有N个国家,每个国家之间都有着汇率,将1.0的货币经过国家间的汇率的转换,最后再变回原来的货币,要求变回来后货币的值要增加,求最少的变换步数解题思路:这题是要求一个环,值大于1.01的最小环,设置一个状态量dp[i][j][step]为从第i个国家开始,经过step的次数后,到第j个国家的汇率,那么dp[i][j][step] = max(dp[i][j][step],dp[i][k原创 2014-12-14 11:27:50 · 648 阅读 · 0 评论 -
POJ - 3660 Cow Contest (floyd变形)
题目大意:有N个人参加了竞赛,现在给出M个比赛成绩,问可以确定几个人的名次解题思路:用dp[i][j]表示i和j之间的关系,如果dp[i][j] == 1表示i能打败j,等于0是表示被打败 如果 dp[i][k] && dp[k][j],就表示i能打败j了。 最后统计一下每个人打败的人数和被打败次数,如果等于n-1的话,就表示这个人的排名可以确认了#include <cstdio>#inclu原创 2015-08-01 01:05:23 · 468 阅读 · 0 评论 -
POJ - 3159 Candies(差分约束系统)
题目大意:给出N个孩子,M个要求,问满足所有孩子的要求时,第一个孩子的糖果和第N个孩子的糖果差的最大值是多少解题思路:差分约束系统的裸题,B孩子比A孩子的糖果大于等于C,所以可以构出一条A指向B的边,权值为C 跑一遍SPFA,注意要用栈代替队列,不然会TLE#include <cstdio>#include <cstring>#include <algorithm>#include <que原创 2015-08-04 22:00:13 · 534 阅读 · 0 评论 -
LightOJ - 1019 Brush (V)(floyd)
题目大意:求第一点和最后一点的最短距离解题思路:100的量,floyd搞起#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 110;const int INF = 0x3f3f3f3f;int dis[N][N];int n, m, cas = 1;void原创 2015-11-10 00:13:33 · 558 阅读 · 0 评论 -
HDU - 1142 A Walk Through the Forest (DP + 最短路)
题目大意:有一个人工作完了,要回家了。家在节点2,办公室在节点1。如果选择A回家的最短路比选择B回家的最短路小,那么他就可以走A点回家,问这个人有多少种回家的方法解题思路:先跑一遍最短路,求出每个节点到家的最短距离,然后进行判断 设dp[i]为从i点到家有多少种方法,如果d[i] > d[j](d数组表示到家的最短距离) 那么dp[i] += dp[j]#include <cstdio>#in原创 2015-07-31 23:41:53 · 650 阅读 · 0 评论 -
UVA - 10806 Dijkstra, Dijkstra. SPFA
题目大意:要你求出从起点到终点的两条线路,这两条线路不可以有重叠的边,且这两条线路的和最短解题思路:两次SPFA,第一次从起点到终点,第二次从终点到起点,但中间要加一点改变,将走过的最短路径的值变为负数,并删除掉相反的边,以免后面从终点走到起点会重复,为什么要将走过的最短路径的值变为负数呢,因为如果将第一次的最短路径都删掉的话,不一定能取得到最大值,有反例的,0----------原创 2014-12-07 21:35:54 · 753 阅读 · 0 评论 -
LightOJ - 1074 Extended Traffic(负环)
题目大意:给出每个点的权值和边,假设边为(u, v),那么该边的权值就是(val[v] - val[u]) ^ 3 问从点1出发,到达所给点的最短路解题思路:有可能会出现负环,出现负环的话,就将负环内的点所能到达的所有点都标记一下#include <cstdio>#include <cstring>#include <queue>using namespace std;const int原创 2015-11-09 23:54:49 · 786 阅读 · 0 评论 -
LightOJ - 1316 A Wedding Party(最短路+状态压缩)
题目大意:有N个点,M条有向边,S个特殊点。现在要求你从0走到N-1,经过的特殊点的数量最多,且走过的路径最小解题思路:刚开始开了一个dp[N][1 << S]的数组,可想而知,MLE了 后面想想,只需要处理出(开始点,特殊点,终点)这些点之间的距离,再用状态压缩去做就好了#include <cstdio>#include <cstring>#include <algorithm>#incl原创 2015-11-10 21:08:00 · 855 阅读 · 0 评论 -
LightOJ - 1099 Not the Best(次短路)
题目大意:找出点1和点n的次短路解题思路:变成2维记录,一个记录最短路,一个记录次短路即可#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int M = 100010;const int N = 5010;const int INF = 0x原创 2015-11-10 00:15:15 · 559 阅读 · 0 评论 -
LightOJ - 1108 Instant View of Big Bang(负环)
题目大意:给你一张带权图,问从哪几点出发,可以走到-INF解题思路:能走到负环的点都可以,现在的问题是,怎么找出这些点 正面不好思考的话,换一下反面,环的性质,一个负环存在的话,把他所有的边的方向都取反,那么那个负环还是存在的既然边可以反向,那么走到负环的边,就变成了负环能到达的边了,这样就比较好求了#include <cstdio>#include <cstring>#include <al原创 2015-11-09 23:57:53 · 1142 阅读 · 0 评论 -
UVA - 10801 Lift Hopping 最短路
题目大意:有那个电梯,要求从0层到达第k层,每个电梯都有上升的时间t,t代表从第i曾到第i+1层所需要的时间,问从0曾到第k层所需的时间最少是多少,如果到达不了第k层的话,请另外输出解题思路:这里解释一下为什么加上60是在换电梯的时候。首先是因为0然后更新所有的点,如果所有的点都是同一个电梯的点话,那么d[u] + g[u][v]就不会小于d[v]了,而是相等,但如果不是同一个电梯,这个式子就原创 2014-12-03 22:33:52 · 639 阅读 · 0 评论 -
UVA - 658 It's not a Bug, it's a Feature! SPFA
题目大意:有N个bug,M个补丁,要求用最短的时间将N个bug补上。给补丁的描述为:第一个参数是个整形,表示用这个补丁修补所需要的时间,第二个参数是个字符串,表示使用这个补丁的前提条件,字符串里面的‘0’表示这个位置的bug可存在也可不存在,'+'表示这个位置的bug一定要存在,'-'表示这个位置的bug一定不能存在,所谓的这个位置指的是该字符的下标,字符串每个字符的下标对应一个bug,第三个参数原创 2014-12-07 20:47:42 · 800 阅读 · 0 评论 -
POJ - 1062 昂贵的聘礼 (最短路变形)
中文题解题思路:将酋长最为源点,用一个结构体纪录每个点到酋长的最短路,和级别范围,在更新新节点时,就可以根据级别范围判断能否更新了#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#define N 110#define M 10010#define INF 0x3f3f3f3fusing原创 2015-08-01 00:09:56 · 652 阅读 · 0 评论 -
HDU 2544(Floyd、Dijkstra、Bellman-Ford、SPFA)
中文题#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#define N 110#define M 10010#define INF 0x3f3f3f3fusing namespace std;struct edgs{ int u, v, dis;}Edgs[M];int dis[原创 2015-07-27 12:00:13 · 730 阅读 · 0 评论 -
HDU - 2066 一个人的旅行
题目大意:中文题解题思路:多源点,任意终点,最短路的变形,用dijkstra或者SPFA都可以,只要把源点设置为多个就可以 任意终点的,那就取每个终点的最小值就可以了#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define N 1010i原创 2015-07-31 23:14:30 · 644 阅读 · 0 评论 -
HDU - 1596 find the safest road (最短路水题)
题目大意:找出两点见安全系数最高的那条路解题思路:直接最短路解决#include <cstdio>#include <cstring>#include <cmath>#include <queue>#define INF 0x3f3f3f3f#define N 1010#define M 1000010#define esp 1e-8using namespace std;stru原创 2015-08-01 00:36:13 · 526 阅读 · 0 评论 -
POJ - 3268 Silver Cow Party (逆向最短路 多源最短路)
题目大意:有N头牛要去农场X参加party,N头牛都很懒,他们想让他们去农场X的路径达到最小,还想要回来的路径达到最小,问这些牛当中,来农场X和回去的路径之和最大的那头牛的路径之和是多少解题思路:先将边逆向求出每头牛到达农场X的最短距离,然后再正向求出农场X到每个点的距离,累加一下就是来和回去的和了,取最大即可#include <cstdio>#include <cstring>#include原创 2015-08-01 00:59:40 · 528 阅读 · 0 评论 -
POJ - 1364 King (差分约束系统)
题目大意:给出N个不等式,让你判断一下这些不等式是不是都成立 给出的样例形式如下 u v gt c 或者 u v lt c 表示第u项到第u+v项的和大于(小于)c解题思路:设d[i]为前i项和 假设给出的是大于不等式,也就是u v gt c 那么可得不等式d[u + v] - d[u - 1] > c,变化的d[u -1] - d[u + v] <= -c - 1 如果给出的是小于的原创 2015-08-05 09:38:26 · 666 阅读 · 0 评论 -
HDU - 4396 More lumber is required (BFS 最短路)
题目大意:有一个需要采集K跟木头,然后到达点T,现在他从S点出发,路上有N个节点,M条边,只要经过1条边,就可以得到10根木头,问需要花费多少时间才能完成任务解题思路:木头最多只有500根,且每次收集10跟,最多也只需要收集50次就可以,而且节点最多只有5000个,所以直接暴力BFS即可#include <cstdio>#include <cstring>#include <queue>usi原创 2015-08-01 00:19:32 · 805 阅读 · 0 评论 -
HDU - 2433 Travel (最短路树)
题目大意:有N个点,M条边,每次删掉一条边,问删掉该边后,所有点之间的最短路的和是多少解题思路:刚开始就想,删掉一次floyd一次,结果可想而之,TLE了 后来看了别人的,发现了一种叫做最短路树的东西。 就是先求出以每个点为源点的最短路并纪录该点到每个点的距离和,和每个点的pre,这样的话,就预处理好了 因为要删掉边,前面我们已经预处理好了最短路树的pre,也就是说,就可以依次判断删除的边是否原创 2015-07-31 23:57:16 · 2257 阅读 · 2 评论 -
HDU - 3313 Key Vertex(在最短路上的DFS)
题目大意:给出N个点,M条有向边,每条有向边的长度为1,现在给出起点和终点,问这张图上有多少个点满足去掉这个点后,使得起点到终点不连通(起点和终点也算)解题思路:先求出最短路,因为长度都是1,所以最短路中的点肯定是最少的 去掉点,且使起点和终点不连通的点肯定是最短路上的点 把最短路上的点标记一下,然后从起点出发进行DFS,如果遇到标记过的点,就将起点重新赋值为走到的最远的标记的点,直到走到终点,原创 2015-09-07 16:43:54 · 455 阅读 · 0 评论 -
HDU - 3870 Catch the Theves(最小割+对偶图==最短路)
题目大意:给出一张图,这张图的每条边都有相应的容量,现在问(1,1)到(N,M)的最小割是多少解题思路:转成对偶图,就可以用最短路了#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXNODE = 160010;const int MA原创 2015-09-07 22:54:51 · 512 阅读 · 0 评论 -
HYSBZ - 1001 狼抓兔子(对偶图+最短路)
题目大意:给出一张图,这张图的每条边都有相应的容量,现在问,从(1,1)到(N,M)的最小割是多少解题思路:转成对偶图去解决#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXNODE = 1000010;const int MAXE原创 2015-09-07 22:53:03 · 553 阅读 · 0 评论 -
HDU - 2647 Reward (最短路 判环)
题目大意:有一家公司,要发奖金了。因为勤劳度不同的缘故,所以奖金不能人人都相同,问如何发奖金才能使得人人都满意,且所花费的总金额达到最小解题思路:我将攀比关系当成了有向边,并赋为-1,如果出现负环的话,表示怎样都不可能满足的 总金额达到最小,那只要比攀比的人多1就好了,这就是赋值为-1的缘故,接着SPFA,求出来,转为正值即可#include <cstdio>#include <cstring>原创 2015-08-01 00:04:20 · 659 阅读 · 0 评论