【最短路/差分约束】
文章平均质量分 57
张松超
这个作者很懒,什么都没留下…
展开
-
HDU ~ 1385 ~ Minimum Transport Cost(floyd+打印路径)
题目网址:Minimum Transport CostMinimum Transport CostTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Problem DescriptionThese are N cities in Spring country. Be原创 2017-04-13 15:49:55 · 382 阅读 · 0 评论 -
HDU ~ 2544 ~ 最短路 (Dijkstra模板,常规版 and 优先队列优化版)
Dijkstra:复杂度:,优先队列优化。优点:稳定。缺点:不能有负权。优先队列: #include<bits/stdc++.h>using namespace std;const int MAXN = 105;const int INF = 0x3f3f3f3f;struct Edge{ int from, to, dist; ...原创 2018-01-28 12:51:52 · 408 阅读 · 0 评论 -
POJ ~ 3259 ~ Wormholes (BellmanFord和SPFA(BFS,DFS)模板)
题意:一个famer有一些农场,这些农场里面有一些田地,田地里面有一些虫洞,田地和田地之间有路双向路,虫洞有这样的性质: 时间倒流。问你这个农民能不能看到他自己,也就是说,有没有这样一条路径,能利用虫洞的时间倒流的性质,让这个人能在这个点出发前回去,这样他就是能看到他自己。输入n个点m条田地之间的路,w个虫洞。思路:有负环输出YES,没负环输出NO。交POJ会CE,换一下万能头就好了。...原创 2018-01-28 23:57:56 · 403 阅读 · 0 评论 -
BZOJ ~ 2662 ~ [BeiJing wc2012]冻结 (分层图最短路)
思路:分层图最短路,思路同:BZOJ ~ 2763,只不过层与层之间的花费不在是0,而是原来的一半。求的是1~N的最短路。建图分层:#include<bits/stdc++.h>using namespace std;const int MAXN = 50 * 50 + 5;const int INF = 0x3f3f3f3f;struct Edge{ int fro...原创 2018-03-11 16:38:47 · 295 阅读 · 0 评论 -
HDU ~ 3499 ~ Flight (分层图最短路)
题意:n个城市m条单向边!!!然后给你这M条单向边。最后输入起点终点,你有一次机会可以使某条边的花费减半,问起点到的最短路为多少?如果没有路可以到达输出“-1”。思路:同BZOJ ~ 2763, 字符串的话用map映射一下就好了。注意要用long long。建图分层:#include<bits/stdc++.h>using namespace std;const int MAXN ...原创 2018-03-11 16:16:58 · 473 阅读 · 0 评论 -
BZOJ ~ 2763 ~ [JLOI2011]飞行路线 (分层图最短路,模板题)
思路:对于k次免费花费,我们可以把图想像为有k+1层,从第0层到第k层,第0层表示没有用过这k次机会,第i层表示用过i次免费花费。对于分层,有两种方法。本题为双向边。注意:最后要从所有层中的终点找答案,因为如果s-t只有少于k条路,而你选取免费k次在到达终点的答案就可能不对。1.建图时分层:建k+1层图。然后有边的两个点,多建一条到下一层边权为0的单向边,如果走了这条边就表示用了一次免费机会比如共...原创 2018-03-08 21:55:24 · 654 阅读 · 0 评论 -
HDU ~ 2680 ~ Choose the best route (反向建边 or 超级源点 + 最短路)
题意:第一行先输入n,m,s表示有n个点,m条边,s表示终点。然后下面m行,每行有三个数字p,q,t表示有一条p到q的单向边,边权为t。然后一行输入起点个数w。下面一行有w个数字,分别表示w个起点。问从起点(任意一个)到终点的最短路为多少?思路1:加超级源点, 然后从超级源点连一条到所有起点的边,边权为0,然后求超级源点到s的最短路就可以了,本题中可以将超级源点设置为0。超级源点:#includ...原创 2018-03-07 14:38:51 · 275 阅读 · 0 评论 -
BZOJ ~ 2118 ~ 墨墨的等式 (建图 + 最短路)【经典好题】
思路:我们取{an}序列中的最小值MIN(其实取哪个都无所谓,只不过越小复杂度越低,先往后看一会就知道了)。假设有X%MIN=i,还有一个数字B%MIN=i,且B>=X,那么B一定能通过X加上若干个(>=0)MIN得到。所以我们求出用{an}数组中的数凑出来的最小的X使得X%MIN=i(0<=i<=MIN-1),我们就可以判断出来BMin~BMax中哪些数字可以被凑出来。我...原创 2018-03-06 20:41:37 · 242 阅读 · 0 评论 -
POJ ~ 1511 ~ Invitation Cards (逆向建边 + (SPFA或(优先队列优化的Dijkstra)))
题意:N(1e6)个点,M条单向边(边权1e9),求1~所有点的最短路径之和,再加上所有点~1点的最短路径之和。思路:正向建边求一次1到所有点的最短距离,在反向建边求一次。加和就是答案。但是数据范围很大1e6,所以要用SPFA或优先队列优化的Dijkstra。还有就是路径之和会超int要开long long。优先队列优化Dijkstra://#include#include原创 2018-01-30 14:16:02 · 277 阅读 · 0 评论 -
HDU ~ 3339 ~ In Action (最短路 + 01背包)
题意:T组测试数据,N个发电站(1~N),M条边。然后M行输入这M条边。每个发电站有一定的发电量,下面N行依次输入这N个发电站的发电量。问我们要派出一些坦克去占领这些发电站,一台坦克只能占领一个发电站。坦克每走一公里耗费一升油。任务要求占领的发电站的总电量超过所有发电站的电量的一半。你一开始在0点,有无限辆坦克,我们完成任务最少花费多少油?如果不能完成任务,输出“impossible”。思路:先跑...原创 2018-03-12 20:54:25 · 279 阅读 · 0 评论 -
PAT ~ L2-001. 紧急救援 (最短路 + 最短路径条数 + 点权最大 + 路径输出)
思路:开一个数组cnt取统计最短路条数,开一个数组sum统计到当前点的点权和,pre记录上一条边是哪条边(也可以直接记录是哪个点)。①松弛操作时,如果两个值相等,最短路径条数就等于前驱结点的最短路径条数加上该节点的最短路径条数,然后再判断点权是否需要更新,如需要更新,pre数组也要对应更新。②松弛操作时,如果可以松弛,最短路径条数就等于前驱结点的最短路径条数数,sum数组更新,pre数组更新。#i...原创 2018-03-13 16:13:02 · 637 阅读 · 0 评论 -
HDU ~ 2433 ~ Travel(最短路径树)
题意多组测试数据,每组输入N,M,表示有N个点,M条边,SUM表示任意两点间的最短距离求和。让你求解,假设每一条边被破坏时新的SUM。思路记sum[i]表示以 i 为起点的最短路之和。对于每个点生成一棵最短路径树,pre[i][j]表示第 i 棵树上到 j 点的那条边的编号,如果删除的这条边,不在第 i 棵树上,那么对sum[i]没有影响,如果在第 i 棵树上,那么就对以 i 为起点的重...原创 2018-11-16 15:03:09 · 442 阅读 · 0 评论 -
POJ ~ 3013 ~ Big Christmas Tree (最短路径树,思维)
题意T组测试数据,每组先输入n,m表示有一个n个点m条边的无向图,然后输入n个点的点权,然后输入m条边(u,v,w),求一棵以1为根节点的数使得该树花费最小,输出最小花费,如果无法构建成一棵树输出“No Answer”。树的花费为:∑\sum∑(边权*子树的点权和)思路通过推样例可以发现每个点的点权需要乘以这个点到根结点的所有边的边权,所以可以得到∑\sum∑边权*子树的点权和 = ∑...原创 2018-11-20 18:41:48 · 264 阅读 · 0 评论 -
Codeforces ~ 1076D ~ Edge Deletion (最短路,堆优化理解)
题意给你一个n个点,m条边的DAG图,边为双向边,没有重边。现在最多保留k条边,怎么使得好点个数最多。好点定义为:在原图中1到该点距离和只保留某一些边后的图中1到该点距离不变的点。先输出保留边的个数,然后输出这些保留的边的编号(1~m)。思路堆优化dijkstra中,更新前 k 个点用到的边就是答案。数据比较大,注意开long long#include<bits/stdc++...原创 2018-11-14 21:18:29 · 553 阅读 · 0 评论 -
BZOJ ~ 1486 ~ [HNOI2009]最小圈 (01分数规划 + dfs版spfa)
题解假设答案为ans,转化为。所以对于每条边,建边w[i] - ans,根据是否有负环进行二分求解即可。#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int INF = 0x3f3f3f3f;struct Edge{ int from, to; dou...原创 2018-09-24 21:54:19 · 196 阅读 · 0 评论 -
POJ ~ 3621 ~ Sightseeing Cows (01分数规划 + 最短路)
题意给一个有向图,点数为L,边数为P,然后输入L个点的点权F[i],接下来输入P条边(u->v边权为w),求一个点权和比边权和最大的环,求这个比值。题解假设点权和为X,边权和为Y,X/Y=ans,求ans最大。u->v边权为w的边,我们建边F[v] - ans*w,可得,我们二分ans,如果对于当前枚举值 x 该函数值小于0,那么x应该变大,如果该函数大于0,x应该...原创 2018-09-23 15:00:28 · 291 阅读 · 0 评论 -
HDU ~ 2066 ~ 一个人的旅行 (反向建边 or 建超级源 + 最短路)
思路同HDU ~ 2680 ~ Choose the best route (反向建边 or 超级源点 + 最短路) #include<bits/stdc++.h>using namespace std;const int MAXN = 1e3 + 5;const int INF = 0x3f3f3f3f;struct Edge{ int from, t...原创 2018-07-18 16:20:28 · 333 阅读 · 0 评论 -
CodeForces ~ 987D ~ Fair (思维 + 多源BFS)
题意:有n(<=1e5)个城市,m(1e5)条边,最多有k(1<=k<=100)个不同类型的物品,你要收集s个不同类型的物品。每个城市会产生一种类型(类型为1~k)的物品,问从每个城市出发收集够s个物品的最小步数。思路:从每个城市进行一遍BFS肯定会超时。因为城市很多,物品类型很少,所以我们反过来考虑,求出来每种物品到达所有城市的最短路径,存起来,跑K次BFS就可以了。对于城市 ...原创 2018-05-31 19:29:54 · 518 阅读 · 0 评论 -
POJ ~ 1201 ~ Intervals (差分约束 + SPFA最长路)
题意:给定n(n <= 50000)个整点闭区间和这个区间中至少有多少整点需要被选中,每个区间的范围为[ai, bi],并且至少有ci个点需要被选中,其中0 <= ai <= bi <= 50000,问[0, 50000]至少需要有多少点被选中。例如3 6 2 表示[3, 6]这个区间至少需要选择2个点,可以是3,4也可以是4,6(总情况有 C(4, 2)种 )。思路:这类...原创 2018-04-13 14:55:46 · 231 阅读 · 0 评论 -
POJ ~ 2387 ~ Til the Cows Come Home(Dijkstra)
题意:求无向图1~n的最短路。n个点m条边,然后m行,每行输入u~v的边权为w。思路:Dijkstra。注意有重边,M和N输入顺序是反着的,先输入边数M,在输入顶点数N。懒得写了,直接怼模板就过了。//#include#include#include#include#includeusing namespace std;const int MAXN = 1e5 + 6;con原创 2018-01-29 09:33:50 · 240 阅读 · 0 评论 -
POJ ~ 2253 ~ Frogger (Dijkstra或Floyd,最大值最小化)
题意:一个青蛙跳石头,现在有N块石头,编号为1~n,输入这N个点的坐标。他要从1号石头跳到2号石头,让你求一条路径,使得该路径在所有路径中为最长边最短的那条路径,问这个最短边?思路:最大值最小化问题。Floyd过程中不存储路径之和,存储路径中的最长边。Floyd://#include<bits/stdc++.h>#include<iostream>#include<...原创 2018-01-29 10:14:05 · 400 阅读 · 0 评论 -
LightOJ ~ 1074 ~ Extended Traffic (SPFA + DFS判点是否在负环中)
题意:T组测试数据,N个点,编号1~N,然后输入这N个点的一个数值。然后又M条边A~B的权值为(B点数值 - A点数值)^3,然后又Q次询问,问1点到X点的最短路为多少?如果①最短路小于3或②不能到达,输出“?”,否则输出最短路的长度。思路:建图跑SPFA,如果有负权环,那么就跑DFS把可以通过这个负权环达到的点都标记一下,因为他们的距离可以通过负权环无限缩短。如果是被标记的点或者最短路小于-原创 2018-02-01 10:59:37 · 474 阅读 · 0 评论 -
POJ ~ 1847 ~ Tram (Dijkstra)
题意:N个点,你要从A走到B,下面有N行表示第i个点可以到达k个地方,每个点可以到达的第一个地方边权为0,其他边权都为1。思路:没有思路。直接Dijkstra就过了。#include#include#include#include#includeusing namespace std;const int MAXN = 1e6 + 5;const int INF = 0x3原创 2018-02-01 09:25:53 · 316 阅读 · 0 评论 -
POJ ~ 1062 ~ 昂贵的聘礼 (加限制Dijkstra + 建图)
思路: 物品看做点,优惠关系看做边。以0当做起点,1作为终点,跑N遍dijstra,每次,控制一个等级区间。不要忘了建一条0~各个物品的边,权值为物品原价格,表示直接买。AC代码1:多加个等级条件即可,然后枚举最低等级,在等级符合要求的区间内求0~1的最短路。求一个最小值就是答案。套的模板,不过忘了调用init,两个小时没整过样例,搞得怀疑人生。程序不允许半点马虎啊,唉。原创 2018-01-31 22:40:11 · 296 阅读 · 0 评论 -
HDU ~ 3592 ~ World Exhibition (SPFA + 差分约束)
和上一道题一样:Layout只不过是T组输入输出,样例变了一下。//#include#include#include#include#includeusing namespace std;const int MAXN = 1e6 + 5;const int INF = 0x3f3f3f3f;struct Edge{ int from, to, dist;原创 2018-01-31 12:52:19 · 319 阅读 · 0 评论 -
POJ ~ 3169 ~ Layout (SPFA + 差分约束)
题意:输入N,ML,MD表示N个人编号为1-N,有ML+MD行,每行三个数字A,b,C。前ML行表示,A和B的距离不能大于C,接下来MD行表示,A和B的距离不能小于C。这些人必须都在一条线上,且两个人位置不能重合。如果这样的排列存在,输出1-N这两个人的最长可能距离,如果不存在,输出-1,如果无限长输出-2。思路:差分约束。三个式子:,求1-N的最长可能距离(即最大值),即最短路,所以把三个式原创 2018-01-31 12:49:33 · 347 阅读 · 0 评论 -
POJ ~ 3159 ~ Candies (Dijkstra + 优先队列 + 链式前向星 or 栈式SPFA)(差分约束)
推荐一片入门博客:夜深人静写算法(四) - 差分约束个人感觉很有用的地方,暂存一下,备查: 4、最大值 => 最小值 然后,我们将问题进行一个简单的转化,将原先的"<="变成">=",转化后的不等式如下:B - A >= c (1)C - B >= a (2)C - A >= b (3) 然后求C - A的最小...原创 2018-01-31 10:17:05 · 361 阅读 · 0 评论 -
POJ ~ 2502 ~ Subway (Dijkstra + 建图)
题意:你要从家去学校,先输入你家和学校的坐标。有一些地铁站线,每一条线上有一些站点,每一条线以一对-1,-1结束,地铁站的输入以EOF结束。坐标单位为米,你行走速度为10km/h,地铁速度为40km/h,问你最快多少分钟可以到学校?地铁只能一站一站的走,方向随意,不能从1号站点跳到3号站点,也不能从第一条线上的站点到另一条线上的站点。思路:一看就是Dijkstra,主要是建图稍微比原创 2018-01-30 22:23:16 · 1021 阅读 · 3 评论 -
HDU ~ 2923 ~ Einbahnstrasse(floyd+map)
题目网址:HDU-2923-EinbahnstrasseEinbahnstrasseTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem DescriptionEinbahnstra e (German for a one-way street)原创 2017-04-11 20:20:32 · 446 阅读 · 0 评论 -
HDU ~ 4725 ~ The Shortest Path in Nya Graph (拆点建图 + Dijkstra)
题意:有T组测试数据,每组第一行先输入N,M,C表示有N个点和N层建筑,有M条双向边,你可以从x层的任意一个点到达x+1层和x-1层的任意一个点,但是需要C的花费。第二行输入N个数,表示第i个点在第l[i]层。然后输入这M条双向边,u,v,w表示u~v有一条权值为w的双向边。求1~N点的最短路。(0 注意:你可以从x层的任意一个点到达x+1层和x-1层的任意一个点,但是这两层得有点才可以。比如原创 2018-02-02 13:11:12 · 320 阅读 · 0 评论 -
HDU ~ 3416 ~ Marriage Match IV (最短路Dijkstra + 网络流Dinic)
题意:T组测试数据,给你N个点M条单向边,再给你起点A,终点B, 问你A~B的最短路最多有多少条?思路:先求出在最短路上的所有的边,然后以这些边建图,容量均为1,跑A~B的最大流就是答案。正向建边跑一边最短路得到一个以A为源点最短路(dis1),反向建边再跑一次得到一个以B为起点的最短路(dis2),最短路径长度为dis1[B](dis1[B]==dis2[A])。如果对于边权为w的边u~原创 2018-02-03 22:49:03 · 318 阅读 · 0 评论 -
POJ ~ 1797 ~ Heavy Transportation (Dijkstra+最小值最大化)
题意:有n个城市,m条道路,在每条路上有一个承载量,求从1到n城市最大承载量,找到一条路。思路:Dijkstra过程中,每次求最长的边(即承载量最大),以最长的边去松弛,松弛的时候取较小值(即承载量)与dis数组比较,取较大的。注意初始化条件,先把所有的承载量都初始化为极小值,源点承载量设置为极大值。懒得写,直接在我的模板上改的。//#include#include#inclu原创 2018-01-29 11:05:52 · 327 阅读 · 0 评论 -
POJ ~ 3268 ~ Silver Cow Party (Dijkstra + 逆向建边)
题意:输入N,M,X。N表示有N头牛,牛1在1处,牛2在2处,依次编号为1~n,这些牛要在牛X聚会,有M条单向道路,聚完会他们需要回到各自原来的地方。问哪个牛走的路最远?输出这个牛走的距离?思路:先正向建边,跑一边Dijkstra的出来牛X到所有牛的距离(即回家的长度)记录下来,然后在反向建边,跑一边Dijkstra求出所有牛到牛X处需要走的距离。两个加起来就是每个牛走的路径长度,求一个最大值原创 2018-01-29 19:23:04 · 266 阅读 · 0 评论 -
POJ ~ 1860 ~ Currency Exchange (BellmanFord或SPFA)
题意:我们的城市有几个货币兑换点。让我们假设每一个点都只能兑换专门的两种货币。可以有几个点,专门从事相同货币兑换。每个点都有自己的汇率,外汇汇率的A到B是B的数量。同时各交换点有一些佣金,你要为你的交换操作的总和。在来源货币中总是收取佣金。 例如,如果你想换100美元到俄罗斯卢布兑换点,那里的汇率是29.75,而佣金是0.39,你会得到(100 - 0.39)×29.75=2963.3975卢布。原创 2018-01-29 22:18:17 · 414 阅读 · 0 评论 -
POJ ~ 1502 ~ MPI Maelstrom (Dijkstra + 字符处理)
题意:N个点。下面N-1行,给出你一些无向边,‘x’表示不互通。问1点到哪个点的距离最远,输出距离?解释下样例,55030 5100 20 5010 x x 10有五个点1~5,1到1的距离为0,没有给出。第二行表示,2到1距离为50。第三行表示3到1距离为30,3到2距离为5。第四行表示4到1距离为100,4到2距离为20,4到3距离为50。第五行表示5到1距离为原创 2018-01-30 10:37:21 · 287 阅读 · 0 评论 -
POJ ~ 2240 ~ Arbitrage (Floyd或BellmanFord)
题意:你现在有N种类型的货币,这N种类型的货币之间有M种汇率关系,然后输入M组关系,A,rate,B,表示每单位A货币可以换rate的B货币。问你有没有方法使自己的钱增多?思路:判断是否正环。货币类型用MAP映射成数字,然后建图。把你有的货币都设置为1的本金。然后跑一边Floyd看有没有货币使得自己变多了。或者跑N遍BellmanFord看有没有哪 次出现了正环。松弛条件改为权值可以变大时,原创 2018-01-30 13:25:52 · 306 阅读 · 0 评论 -
POJ ~ 3660 ~ Cow Contest (Floyd + 闭包传递)
题意:有n(1保证输入信息不存在矛盾第一行n和m。以下m行 A B 表示A实力比B强。思路:Floyd闭包传递。//#include#include#includeusing namespace std;const int MAXN = 105;int n, m;bool d[MAXN][MAXN];void Floyd(){ for (int k =原创 2018-01-29 22:52:15 · 316 阅读 · 0 评论 -
HDU ~ 4370 ~ 0 or 1 (建图(难想) + Dijkstra)
题意:给你一个矩阵C,让你构造一个只有01的矩阵X使 ∑C[i][j]*X [i][j](1构造出来得X矩阵需要满足一下关系:1.X 12+X 13+...X 1n=1 2.X 1n+X 2n+...X n-1n=1 3.for each i (1思路:超级难想的转化,其实对于这三个条件我们可以把理解为一下三个条件:1.1点出度为12.n点的入度为13.其他点的原创 2018-02-05 15:07:19 · 545 阅读 · 0 评论 -
POJ ~ 1125 ~ Stockbroker Grapevine (Floyd)
题意: 众所周知,证券经纪人对于市场传闻十分敏感。现在你被雇佣去开发一种在经纪人之间传播虚假信息的模式,使得你的雇主在市场中获得特殊的战略优势。为了获得最大的效果,你必须在尽可能快的时间内传播谣言。不幸的是,证券经纪人只信赖来自他们认为是“可靠来源”的消息。这意味着你必须在开始传播流言时考虑他们之间的关系。当流言开始传播时,某个经纪人需要一定的时间将其传递给他的所有同事。你的任务是编写一个原创 2018-01-29 09:27:03 · 345 阅读 · 0 评论 -
牛客国庆集训派对Day3 ~ I ~ Metropolis(多源最短路,好题)
思路本题是要求多点到多点的最短路,容易想到floyd但是时间明显爆炸。我们另辟蹊径,我们把所有源点入队,跑dijkstra,如果某一条边(u,v,w)同时被两个点扩展到了的话,那么这两个点之间最短路就是dis[u]+dis[v]+w。我们用from[i]表示第 i 个点是被第几个源点扩展到的,如果某条边的from[u] != from[v],那么这条边有就是由两个不同的点扩展到的。注意开...原创 2018-11-17 21:34:07 · 276 阅读 · 0 评论