随笔分类 - 最短路
摘要:题意:给出N个点和M条有向边,求给出的s点到t点的最短路。思路:spfa,只是这题给出的是有向边,在存储的时候只存一条边就可以了,其他的和无向边一样。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue>#include <math.h>#include <vector>#include <map>
阅读全文
摘要:题意比较好理解,但是题目给出的要求却比较麻烦,给出的有向边是有顺序的,后面的边不能用在它前面出现的边,因为题目要求找出的最短路必须是按照给出的顺序,麻烦就麻烦在这,否则一遍bfs就找出最短路了,看到discuss里有人说可以用O(n)过,但是就是没想出来,最后,不得不查了解题报告,看到有人是将点的位置进行连线,相邻位置之间设为1,如果临近的相同元素之间设为0 ,这样从0~n-1找一天最短路就可以了。Hint:n是大于100000,开到10^6差不多,因为这挂在了15组数据上一次了。代码:View Code #include <stdio.h>#include <stdlib.
阅读全文
摘要:题意:有N座城市,M条路,求是否有两座城市间的路长度大于等于s。思路:题目中说这条路可以是任意地方开始,任意地方结束,所以只要有一条路大于等于s就可以了。可以先用排除法来确保这个图为无向无环图。1)如果图中有环,输出“YES”;2)如果图中有自环,输出“YES”;3)如果图中有重边,输出“YES” ;在输入的时候判断一下,然后用floyd求最长路,所有路中有一条路长度大于等于s就可以完成。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iost
阅读全文
摘要:删除A、B点之间的连线,然后求两点间的最短路,如果有最短路,加上A、B之间的长度求最小值,就是所要求的最短环。但是还要求输出路径,我是用Spfa求最短路的,同时记录路径。用这种方法做完之后,看到discuss里有许多用floyd求最短环的,就上网搜了一下。原来可以直接用floyd在O(n^3)的时间里求最短环,但是这个标记路径有点麻烦,最终也没想出比较好的记录路径的方法,但是的确求出了最短环。spfa求最短路算法:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#includ
阅读全文
摘要:困啊!!不知道学校怎么想的,一声令下就要每天开始晨练,由于消息来得过于突然,导致的后果就是,食堂吃饭的人剧增,去的晚了点差点没吃上饭;起得太早没睡好,上课浑浑噩噩的,唉,今天还是早点睡吧。。。。。本来打算昨天做完这题就开始下一个知识点的,但是前两天做一场CF,里面有两道数论题,当时没做出来,昨天就做了做,所以推到了今天。题意:给出一个R*C的矩阵,每个矩阵的点都有一个海拔高,开始有一个初始速度V,然后每个点的速度是V*2^(h[1] - h[i] ),所花费的时间是速度的倒数,求从左上角的点到右下角的点的最少时间。思路:从公式可以得出,要从a->b->c,则c出发的速度就是V*2^
阅读全文
摘要:又是一道改变松弛条件的题目,因为查询不是一组,所以用floyd比较快。解题过程:题目很容易理解,就是从一个点A到另一个点B的所有路中最大高度中的最小值。因为有多组查询,用floyd求任意两点间的最小值,改变一下map[i][j]里的存储,存储点i到点j的所有路中的最大高度的最小值就行了。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <math.
阅读全文
摘要:最近几天一直在做搜到的一些中级最短路题目,做得多了也有了一点感觉,觉得中等最短路一般不是建图麻烦些,就是松弛的条件要改变一下得到所求。其实了解透了几种最短路求解方法就很简单了。解题过程:一颗有N个节点的树,点1是根节点,每个节点都有一个权值,每两个节点的边都有一个代价,定义一棵树的花费为每条边的代价为该边所有子孙节点权值之和乘以该边的权值。例如点1到点2的边的代价为w1,点2到点3的边的代价为w2,得出下面等式:(d1+d2+d3)*w1 = d1*w1 + d2*w1 + d3*w1 (d1+d2+d3+d4)*w2 = d1*w2 + d2*w2 + d3*w2 + d4*w2加起来的:s
阅读全文
摘要:和2253题类似,但所求正好相反。题意:有M条路连接N座城市,每条路都有最大载重量,要从城市1到到城市n求最大的载重量。思路:就是要求所有路中的最小值中的最大值,呃,将2253题的松弛条件改一下就行了。不多说了。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <math.h>#include <queue>#define N 1
阅读全文
摘要:题意:有个N个点的有向图,求从点1到其他各点,然后从其他各点回到点1的最小距离。思路:题意很容易理解,但是这题给的时间有点紧,不能用Dijksra 和Bellman_ford来做,只能有Spfa,先求出点1到到其他各点的最短距离,然后将边逆转,再求一下点1到各点的距离,求和就行了。明明思路是对的,但是愣是WA了一上午,不知道哪里错的,将discuss里提到的各种注意都改了,还是不对,差点疯了,结果不知道改了点什么就AC了,郁闷啊!!!代码:View Code #include <stdio.h>#include <stdlib.h>#include <string
阅读全文
摘要:其实这题是昨天做的,不过没来的及写Blog,还有通过这题想通了一些问题,所以想专门的抽个时间好好写写,嗯,今后要好好写Blog,利用这段时间好好整理一下自己的思路,这样也好。这题的题意就不说了,汉语,没有什么理解上的问题,这题最大的障碍就是在怎样处理等级问题上。开始的时候,我尝试着用Bellman_ford,在松弛的时候加上等级的处理,但是我理解错了一句话,“地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。“这句话是说从源点开始扩展的所有点都必须在源点的等级限制范围内。而Bellman_ford的松弛处理则并不能保证这一点。所以很不幸的WA了,然后看discuss里的人用
阅读全文
摘要:题意:给出一个有N个点的图,求每一个点到其他各点最长距离中的最小值。思路:读懂了题意,这题就是一个水到不能再水的题。就是一个flody,然后求出任意两点的最小距离。然后一个二重循环就行了。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue>#include <math.h>#define N 105#define IN
阅读全文
摘要:我发现,做题最痛苦的就是读不懂题,比这更痛苦的是,上网搜题意竟然还是错的,纠结啊。。。。。。唉,看了N个解题报告,终于明白了题目的意思,就是有一只青蛙在1号石头上,他要跳到2号石头上,中间可以借助其他石头,一条线路中最长的那段距离作为这条路的代价,求所有路中代价最小的那个。如果读懂了题这题就很容易做了,刚开始的时候,看了discuss里的一个公式,map[i][j] = min(map[i][j] , max(map[i][k] , map[k][j] ));三重循环直接求出来了。代码:View Code #include <stdio.h>#include <stdlib.
阅读全文
摘要:题意:农民john有N快田,M条路,w个虫洞,虫洞的功能回到多少分钟之前。思路:想法很简单,将w个虫洞的值存为负值,然后求图中是否有负环路,如果有就输出“YES”,否则输出“NO”。但是题目中有重复的路要滤除,还有这题有连接表存储比用邻接矩阵存储有简单。代码:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue>#include <
阅读全文
摘要:最短路问题,但是刚开始的时候没什么想法,因为看到题目中要求回到源点,但是最短路都是求一个点到另一个点的最短路,想到要处理环,就有点头疼,因为对最短路理解的不透彻,又上网认真的学了学求最短路的各种方法。Dijkskra:贪心的思想,从源点开始,先查看所有与源点相连的点,找出一条最短的路,然后从这个点重复上一个过程,直到找到目标点。要求图上的权值为非负数,时间复杂度为O(n2)。Floyd:这是我认为写法最简单,也是最容易理解的一种算法,可以想成一个图中只有三个点,判断一下,是源点直接到终点近,还是通过中间那个点间接的到终点近,如果通过间接的点近,就更新,由此推到有n个点的图中,所以三重循环即可。
阅读全文
摘要:题意:有N个城市M条路相连,有两种收费方式,一种是在城市Ci时收费为Pi,另一种是在城市Bi中Ri,求从城市1到城市N的最小花费。其中Pi要小于Ri。思路:其实我觉得这就是一道变形的最短路问题,虽然是用的深搜,但原理是一样的。首先将于城市Ai相连的城市都存起来,然后用一个数组记录城市I是否被访问过,如果访问过,当然可以直接在城市I缴费,原以为每个点访问一次就行了,可是后来想一想,不是这样的,要是这样的就没法提前在Ci城市缴费了,后来在网上看到有人是“闸数”,也就是一个点最多不会被访问超过3次,否则就退出,然后就按这个方法来做的~代码:View Code #include <stdio.h
阅读全文
摘要:题意:给出一个N*M的矩形,每个小矩形里有的有一定数量的矿物,有的有传输的功能,有的不能通过,每个小矩形里的矿物只能采集一次,问你最多能过采集多少的矿物。思路:强连通分支+spfa,先求出强连通分支,在强连通分支中,所以点都是可达的,然后进行缩点,将每一个连通分支看做一个点,而这个点的矿物容量就是这个强连通分支中所有点的和,然后在用一下spfa求最大的矿物量。PS:因为没注意一个循环的长度,导致我查了一个下午加一个晚上,泪~~,细心!细心啊!代码:View Code #include <stdio.h>#include <stdlib.h>#include <st
阅读全文
摘要:嗯,不得不承认自己做题真的太不用心了,不去想实现的细节,总是错在细节,不能怨别人不相信自己,是自己不够让别人相信,代码能力差是一回事,但用不用心是另一回事~好好检讨一下自己。题意:给出N个电力传输点,电力每经过一个点会损耗一定电力,让你找出一条损耗电力最小的路;思路:题目中的数据范围很大,要用邻接表存储边,用队列搜索比较快。代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include
阅读全文

浙公网安备 33010602011771号