Timus #1162. Currency Exchange

题目:一共N个货币种类,当前为S种类的货币,当前拥有的该货币价值为V,下面M行包含可以交换货币的汇率/手续费信息:A,B,RAB,CAB,RBA,CBA分别代表种类A,种类B,A到B的汇率,A到B的手续费,B到A的汇率,B到A的手续费。求能否通过某种交换方式能让货币越来越多即大于V。

解析:Bellman-Ford。修改#1450代码即可

Timus #1160. Network

题目:有N个路由器,给出M个无向连接方式及其长度,需要将所有点可以连接起来,找到最大的连接长度中最小的。但是输出的时候输出总长度没啥关系,你可以输出很多长度小于最小的最大连接长度的点的关系。

解析:最小生成树算法。

我的代码很垃圾,模仿Prim算法,但是把所有相邻信息升序保存在neighbor中,代码写起来更简单,但是复杂度会变大很多很多。(但是能过就行)

Timus #1450. Russian Pipelines

题目:有n个点,接下来输入m行,表示从a点到b点有向边距离为c,求从S(start)起点到F(Final)终点最大路径。

解析:求最大路径问题
1. Bellman-Ford算法
2. 拓扑,利用入度(In-degree)。从入度等于0(只可能有出度)的点开始拓扑,相邻的点入度-1代表还剩in-degree个点还没拓扑到他,如果该点所有可到他的点均已经寻找完,则把该点加入queue,即可以从该点进行下一步拓扑。

错误提示:
1. WA3 Dijskra算法写错
2. TLE16 Dijskra算法因为只要小于就要加入queue,比入度算法复杂度高,不要用Dijskra改版算法,换算法
3. WA9和WA10。小部分神奇原因:输出强制类型转换成int。大部分原因:不要第一个就从开始点开始拓扑(我也不知道为什么,就是错的)。

Bellman-Ford算法

In-degree

Timus #1806. Mobile Telegraphs

题目:有n个数,每个数都由10个数字组成。并输入int costs[10];作为传递时间。每两个数之间要是有一位不同或有两位可以通过交换得到则这两个数可以互相传递,且传递时间为costs[有多少位相同的前缀]。输出从第一个数到最后一个数所要的最短时间。

解析:最短路径问题。记录两两之间的时间,用Dijkstra算法求解。

代码解析:
建议写代码前阅读以下条目
1. 存储数的方式可以是string,但是最好是long long,所占位数少,但对最终结果及是否通过没有太大关系。string好判断更简单,用long long判断比较烦,看个人喜好了。
2. 如果你卡在TLE(Time Limit Exceeded)8见此条。若用两个for循环依次记录相互之间的可达性会卡在Test 8。因为输入N非常大,导致超时。解决办法:建立所有数字/字符串的哈希表(map),改变每个数字一位/两位,看是否有相同的数字/字符串在输入中。因为哈希表的查找迅速,尽管改变次数多,但依旧比两个for循环来得快。
3. 如果你卡在WA(Wrong Answer)3见此条。你写的Dijkstra路径记录错误,Dijkstra算法是会更新路径,不是简单的输出此迭代得到的路径最短的点。
4. 如果你卡在WA8见此条。计算可达两点距离时出现错误,可能你写成了if(i == j)应写if(int(name[i] – ‘0’) == j)←对于储存形式为string来说。
5. 如果你卡在MLE(Memory Limit Exceeded)11见此条。在Dijkstra算法中只需要当前point相邻的点即可,并不需要全部的。最好不要在结构体中加入类似于unordered_map <Point*, int> neighbor;导致每个点都储存了可达点的数据,很容易造成内存溢出,并且没有这必要,造成内存浪费。记得new不用之后要delete。
7. 为了更加节省内存,你可以修改unordered_map <Point*, int> neighbor;为vector <int, int> neighbor;这样可能你放在结构体里面也不会MLE。
6. 推荐:
INF = 0x3f3f3f3f;
neighbor用unordered_map存储

Timus #1080. Map Coloring

题目:有k行,每行包含第i个点相邻的点。现有0/1两种颜色,相邻的颜色必须不一样,如果能进行涂色,输出每个点的颜色,如果不能进行涂色,则输出-1。

解析:
1. BFS
2. 我没用那么高级的方法,就只用vector迭代涂色。

浙ICP备2021019730-1    浙公网安备 33010902002953号
Copyright © 2024 PanCake