随笔分类 -  最短路

摘要:强连通分量 + 最短路题意:城市间通信,给出n,n个城市,m,m条边,分别是端点和权,如果两个城市属于同一个国家,那么他们的通信时间为0,否则则按边权算一次的通信时间。两个城市被认为在一个国家,是从A能到B,从B也能到A。下面给出K个查询,能从u到v传递信息,需要多少时间,如果从u无法传递到v,输出那个长长的英文句子其实就是一个最短路,但是最短路的边权有讲究,虽然给出了u,v,w,但是u和v可能是同一个国家的,那么w应该是0而不是原来的值,所以要怎么判断u和v是不是在同一个国家,也就是他们可以互达,很明显不能查询一次判断一次,而是应该先搞出强连通分量,属于同一个强连通分量的两点间的边权为0这题 阅读全文
posted @ 2013-05-09 22:27 Titanium 阅读(313) 评论(0) 推荐(0)
摘要:最短路题意:比较懒有点难描述,所以不说了,看Hint可以看懂的本题的巧妙之处是其实无论怎么走,从起点(固定的)走到任何一个点,到达那个点的时候速度都是确定的因为 速度为spa ,a--->b---->c , b点速度为 spb = spa * 2^(ha-hb) , c点速度为 spc = spb * 2^(hb - hc)式子一合并,就是 spc = spa * 2^(ha - hc) ,可见从点a走到点c,无论中间经过什么点,最后计算速度,之和点a和点c的高度差有关,当然和点a的速度也有关而起点是固定的(1,1),而起始速度是知道的,那么从点(1,1)走到任何一个点时的速度也就 阅读全文
posted @ 2013-05-06 22:37 Titanium 阅读(507) 评论(0) 推荐(0)
摘要:最短路题意:给n个点从1到n标号,下面一行是每个点的权,另外给出m条边,下面是每条边的信息,两个端点+权值,边是无向边。你的任务是选出一些边,使这个图变成一棵树。这棵树的花费是这样算的,1号固定为树根,树中每个双亲节点下面的边都有个单价(即边权),然后单价乘上这条边的下面所有的子孙后代的点权和(看sample2,只要除掉边 1 5 9 按照这个方法就能算出1210)分析:把sample2用式子列一下就能发现,每个点的权都要乘上好几条边的权,是哪几条边呢,就是这个点回到点1的路径上的那些边所以最后的树的花费可以写成 res = sum{ (点权) * (该点回到点1的路径的边权和) } ,这些点 阅读全文
posted @ 2013-05-06 19:35 Titanium 阅读(1251) 评论(0) 推荐(0)
摘要:继续复习Dij变形,可用DP题意:求点1到点n,最大的载重量。转化为 ,1到n有多条路径,每条路径都有一个最小的边,求这些最小的边中的最大值定义d[v] 表示到点v的最小边最大值 , 从u到v,边权为w,那么首先选出 temp = min( d[u] , w) , d[v] = max(d[v] , temp)这是显然的,由u到v,边权为w,要经过这条边,必须流量不能比w大,否则流不过溜过去之后,选最大的用优先队列+dij变形来做,改变的只是松弛的条件而这中问题,用dp来解也是显而易见的,不写了,以前写过#include <cstdio>#include <cstring&g 阅读全文
posted @ 2013-05-05 23:08 Titanium 阅读(265) 评论(0) 推荐(0)
摘要:最短路题意: 强调是有向图 , n个点(1到n标号)m条边,求出点1到所有点的最短路之和 + 所有点到点1的最短路之和什么?求一次最短路,然后 x 2 就是答案? 这样是错的,如果是无向图的话可以这样,因为可以逆回去走。但是有向图显然不是,点1到点a的最短路,和点a到点1的最短路是完全不同的,值不同走过的路径也不同.要求点1到所有点的最短路,直接运行一次最短路即可。但是要求所有点到点1的最短路,难道要对所有点运行一次最短路吗?一看点数就可以否定这个想法。可以这样想,如果点a到点1存在最短路,那么把这条路径的边全部取反,就是点1到点a的最短路了。所有在求了第1次最短路后,将 整个图的边取反,再求 阅读全文
posted @ 2013-05-04 22:38 Titanium 阅读(1133) 评论(0) 推荐(0)
摘要:差束约分题意:有n个屋子,超人从最矮的屋子开始,依次跳下比当前屋子高且最接近当前高度的屋子(即按照屋子高度增序来跳),但超人跳跃还有一个水平距离限制D,他每次跳的水平距离<=D。现在给你每个屋子的高度是它们的相对位置,你不能改变屋子的相对位置,但是可以水平移动屋子,使得最矮的屋子和最高的屋子的水平距离最大。如果无论怎样移动,超人都无法跳到最后那个屋子则输出-1这题是个差束约分看sample说明问题sample34 2 10 20 16 13 超人从10开始,跳到13,但是10和13的水平距离至少为3,但超人的水平限制距离是2,所以无论怎么移动都无法跳过去,输出-1看sample14 4 阅读全文
posted @ 2013-05-04 16:42 Titanium 阅读(910) 评论(0) 推荐(0)
摘要:训练的题目最短路变形题意:这个题意,太长了,总结回来只有两三句话。输入n表示n个点,从0到n-1,输入m表示m条无向边,输入t,表示终点。要你求起点0到终点t的最短路,不过要先满足一个条件,就是路径的点数不超过10个(包括起点和终点在内 <= 10),如果在10个点内娶不到或者图根本不连通,那么输出no,否则输出最短路又是一个加了限制的最短路,是要先满足10个点以内再求最短路的,训练的时候就是看错了一直WA。这题和 poj 1724 ROADS 是一样的题目。可以看作每条边的花费是1点数,你从0出发,手上有9点数,在点数够用的情况下走到终点t的最短路因此仿照poj这题的代码,写了一个dp 阅读全文
posted @ 2013-04-30 20:10 Titanium 阅读(238) 评论(0) 推荐(0)
摘要:差束约分有人将这题归为最短路的中等题,所以做一下,但是发现其实是裸的差束约分题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果m行信息,所以得到m个不等式 : XB - XA <= C , 所有不等式加起来就是一个差束约分系统对应最短路模型,一开始是 d[v] >= d[u]+w (有向边u--->v) , 在进行完最短路后则变为 d[v] <= d[u] + w ,转化为 d[v] - d[u] <= w这个和上面的 XB - XA <= C 是相同的模式 , 因此建图的时候有向边 阅读全文
posted @ 2013-04-30 00:17 Titanium 阅读(1039) 评论(0) 推荐(0)
摘要:最短路变形题意:你有K个点数,有N个点,M条边,边为有向边,包含4个信息,两个端点+边长+走这条边需要付出的点数。你的任务是,从1号点出发走到n号点,在点数够用的情况下,走出一条最短路,单case显然是一个最短路的变形,而且是一种常见的模型。最短路本身是一个求解最优解的问题,在这里加多了一个限制条件,就是点数,所以变为“在一定的限制条件下求解一个最优化问题”的模型,这样的模型,可以由一个大致的套路,就是,在满足限制条件后,再进行更新下面将讲3个方法,前两个其实都是BFS,第3个事DFS,是一个记忆化搜索。我们先说BFS1.优先队列+dij(最快) 判断一个元素能否入队,不再是看它的最短路估计值 阅读全文
posted @ 2013-04-28 23:20 Titanium 阅读(2950) 评论(0) 推荐(0)
摘要:最短路径选拔赛的题目,当时一看就觉得做过类似的,马上写了个DP,怎么都WA,一直WA到结束。后来才想起来是个图论,求最短路题意:给一个矩阵,T表示树,.表示沙,#表示路,都是可以走的,而且他们各自带有一个值,vt,vs,vp,走到这个点要算上他们带的值,@表示石头不能走。再给你起点的行列和终点的行列(行列都是从0开始标记的),每次你都可以往上下左右四个方向走,重复走回同一个点也行,问你从起点走到终点的花费最少,(其中,起点带的那个值不用算上)首先读入原始的矩阵,把他们的值都记好,石头不能走,可以把它的值赋值为无穷,也可标记为-1,等下不需要用到它(代码中是标记为-1)然后按行从左到右给所有点标 阅读全文
posted @ 2013-03-09 21:18 Titanium 阅读(322) 评论(0) 推荐(0)
摘要:最短路 OR 搜索这题大多数是归为图论题,求最短路径,看了一下题目,确实是这样的意思,但是我却很难想到怎么最短路。后来觉得搜索更形象易懂所以写了一个dfs,但是wa,然后看了一下解题报告才发现有个地方理解错题意了。根据题意做了小修改就过了题意:其实就是找一条最短路径,但是路径中任意两个点的等价差不能超过限制值(我一开始的理解是两个直接相连的点的等级差不能超过限制值)/*建图:一个物品就是一个点,一个物品能容另一种物品来换,那么就是两个物品间可能相连,为什么是可能,因为还要两个物品的等级满足条件。因为物品数上限为100,用邻接矩阵来建图方便。再注意一点,这是个有向图,要得到i物品可以用j物品来换 阅读全文
posted @ 2013-02-19 18:45 Titanium 阅读(555) 评论(0) 推荐(0)
摘要:最短路变形题意:输入n和m表示图的顶点数和边数然后下面m行给出每条边的信息(无向图)。起点是办公室编号1,终点时家编号2。从1到2,问满足要求的路径条数。要求就是,该条路径经过A点到B点的话,那么经过B点到家的最短路径值要小于A点到家的最短路径值,关于这句话是什么意思,看下面的注释还好是1A了这题,否则的话感觉要调试很久//先以家为源点运行一次dij得到家到每个点的最短路(也就是每个点到家的最短路)//那么从办公室到家的最短路(一条或多条)一定符合题目的要求,因为最短路本身有最优子结构的性质//还有一些路径,不是办公室到家的最短路,但是它符合题目的要求//例如办公室为O,家为H,从O到H的最短 阅读全文
posted @ 2013-02-19 16:14 Titanium 阅读(211) 评论(0) 推荐(0)
摘要:DP构建(仿照Floyd)这题说难挺难的,现在想想好像也不太难,是因为想复杂了。其实这题的要求不算多,它仅仅是要求最后转换回到出发时的那种硬币并且获利大于0.01,而转换次数不能超过n次,转换次数越少越好,然后输出最短的路径。注意:题目并没有说要你获利最大,只是是获利>=0.01即可,另外题目对路径并没有什么特殊要求,仅仅是要求不能超过n,在路径长度相同的情况任意一条都可以的。所以我们就抓住一点:转换次数!!!!!!也就是说每转换一次,我们就去找所有的货币,看他们回到自己的时候那些货币的获利已经大于0.01了,如果有货币的获利已经大于0.01了,那么我们的算法就结束了,就输出这种货币的转 阅读全文
posted @ 2012-12-26 19:55 Titanium 阅读(1288) 评论(0) 推荐(0)
摘要:最短路(隐式图搜索)题目是过了,不过时间好慢,用了2.200s。大概是没有用位运算的原因,我是直接模拟的。而解决最短路的问题是用spfa来做(感觉这种思路更加形象和容易理解,并且更符合隐式图搜索的感觉)来说说题意,这个题意都是很长很烦的。首先给出n和m,表示有n个bug和m个补丁。一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug,所以目标状态就是n个0。对于每个补丁,会给出使用这个补丁的时间,另外会给出两个长度为n的字符串,第一个字符串表示这个补丁适用于什么情况下的bug,第二个字符串表示使用完这个补丁后原来的bug会变成怎么样。先 阅读全文
posted @ 2012-12-16 19:02 Titanium 阅读(1108) 评论(1) 推荐(0)
摘要:题意:有n个铁环用长度均为1的绳子连起来(不会有重边)。试图拿起两个铁环并在水平方向拉直,那么会有一些边会被拉直(可想而知有些绳子不会被拉直而是弯曲的),那么取哪两个铁环并拉直,能使被拉直的直线最多呢?输出最多的边数这题其实是最短路,而且通过这题可以帮助我们更形象地理解最短路的实质尤其理解松弛操作当两个点a,b被拉直,那么其实那些被拉直的边就是最短路径(从a出发到b,或者反过来也行,因为是无向图),也就是说,要找到所有的最短路径并统计有多少条不同的边(因为不同的最短路径可能共用相同的边),那么就是这两点的数目,我们只要枚举任意两个点被拉直时不同边的数目,并找到最大的那个就可以了。所以要先知道任 阅读全文
posted @ 2012-12-12 20:01 Titanium 阅读(330) 评论(0) 推荐(0)
摘要:最短路裸题啊,顶点数较多开不了邻接矩阵的,而且边数相对较少,稀疏图,用邻接表,写了个spfa和一个优先队列的dij,当做练手spfa#include <cstdio>#include <cstring>#include <queue>using namespace std;#define N 20010#define M 50010*2#define INF 0x3f3f3f3fstruct edge{ int u,v,w,next; }e[M];int first[N],d[N],vis[N];int n,m,s,t;void spfa(){ queue 阅读全文
posted @ 2012-12-10 20:17 Titanium 阅读(587) 评论(0) 推荐(0)
摘要:题意:固定起点1和终点n,从1到n,再从n回到1,去和回的路上相同的边只能用一次,求两次的和最短,如果去的时候不能去到终点或者回的时候回不到起点那么就输出Back to jail,否则输出两次和的最小值(此图是无向图,不会有重边,边的权值在大于1小于1000)两种理解一种思路是最小费用最大流另一种是最短路不唯一且两条或者多条最短路由共用边 ,或者最短路与次短路有共用边我先写的是第二种思路,最小费用最大流还没写,明天补上,并且补上思路第二种做法是,把无向图当做有向图处理,拆成两条边,先从1到n做一次最短路,并且要记录这条有向路径。最短路结束后,记录下最短路的值d[t],如果为d[t]=INF(t 阅读全文
posted @ 2012-12-09 23:51 Titanium 阅读(1048) 评论(0) 推荐(0)
摘要:DP(仿照Floyd)题意:一个无向图,然后多个查询,查询是起点和终点s和t,s到t可能有多条路径,那么每条路径都会有一条权值最大的边,在所有的最大边中找一个最小的,如果s到t之间不连通,那么输出no path想了很久,大概有两个小时的样子…………然后看了一下数据,刚好最多有100个点,最多10000个查询,那么就给了一个很大的启发,会不会有一个算法会好像dij一样,运行一次能得到做个答案,或者一个算法好像floyd一样,运行一次可以知道所有答案,出于数据的特殊性,我更倾向于往floyd的方向想。floyd的本质是DP,其实这个问题也很容易发现就是个DP,状态转移方程为max=MAX{ d[i 阅读全文
posted @ 2012-12-08 23:08 Titanium 阅读(358) 评论(0) 推荐(0)
摘要:最短路题意:有一栋楼100层,从0到99编号层数,有多部电梯(最多5部),给出每部每部电梯的速度,即上或下一层楼所用的秒数。然后每部电梯不一定在所有楼层出现,给你所有电梯可能出现的层数。给你一个目标层,要你从0层开始到目标层,问所用时间最短。在0层的时候选择做哪步电梯出发不需要时间的,但是在中间的楼层,想换电梯的时候,需要60秒这个题目看完就可以想到是最短路,每层楼是1个顶点,一共100个点,然后对于楼层而言可以通过电梯到达的话就是有一条边,权值就是时间,那么可能出现平行边,比如1号电梯可以从10楼到20楼,用时200秒,2号电梯也可以从10到20楼用时100秒……………………这题,一开始没想 阅读全文
posted @ 2012-12-07 13:28 Titanium 阅读(554) 评论(0) 推荐(0)
摘要:这个题目,做之前不知道什么事差束约分,看完题目上床睡觉,想了半个小时,想到了要判断一个有向图有没有负环。第二天起来再想,觉得是判断有没有环(包括负环,正环,0环),但是不确定,要真的是这样的话,要权值来干什么,直接拓扑排序就好了,然后不确定,找了解题报告瞄一下,个个都是差束约分,然后没看其他内容,直接去学差束约分,看算法导论和网上的资料看了一个小时,懂了,就写,其实就是差束约分的模板题说说思路和题目:给你一个长度为n的序列,从下标1到n标号,然后给你m个连续的子序列,让你求和,和要大于或者小于给定的k,如果这m个不等式都能成立,就输出成功,只要有一个不成立就输出不成立。sample中第一个就是 阅读全文
posted @ 2012-11-29 19:13 Titanium 阅读(730) 评论(0) 推荐(0)