摘要: Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为,空间复杂度为。原理Floyd-Warshall算法的原理是动态规划。设为从到的只以集合中的节点为中间节点的最短路径的长度。若最短路径经过点k,则;若最短路径不经过点k,则。因此,。在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。(见下面的算法描述)算法描述Floyd-Warshall算法的描述如下:for k ← 1 to 阅读全文
posted @ 2014-03-10 22:30 SangS 阅读(675) 评论(0) 推荐(0) 编辑
摘要: 题目描述:为了加快城市之间的通行和物资流动速度,A国政府决定在其境内的N个大中型城市之间,增加修建K条公路。已知这N个城市中的任意两个都能相互连通,且已知其最短的路径长度。为了时刻监测修建新路对A国城市的影响,特任命你为观察员,负责在每修建完一条公路之后,就向该国领导汇报当前N个城市间的最短路之和。思路1. 这道题目是 floyd 算法的变形, 题目已给出任意两个城市之间的最短距离, 每次增加一条道路, 求解增加这条道路后各个城市之间的最短路径之和减小到多少2. floyd 算法描述如下Floyd-Warshall算法的原理是动态规划设为从到的只以集合中的节点为中间节点的最短路径的长度。若最短 阅读全文
posted @ 2014-03-10 21:37 SangS 阅读(538) 评论(0) 推荐(0) 编辑
摘要: 题目描述: Every positive number can be presented by the exponential form.For example, 137 = 2^7 + 2^3 + 2^0。 Let's present a^b by the form a(b).Then 137 is presented by 2(7)+2(3)+2(0). Since 7 = 2^2 + 2 + 2^0 and 3 = 2 + 2^0 , 137 is finally presented by 2(2(2)+2 +2(0))+2(2+2(0))+2(0). Given a posit 阅读全文
posted @ 2014-03-10 19:22 SangS 阅读(380) 评论(0) 推荐(0) 编辑
摘要: 题目描述:哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和思路1. 构建哈夫曼树然后 topDown 遍历即可2. 也可以不显式的创建树. 所有树叶点的和即为所求(根节点以外)代码 STL priority_queue 自定类型不会用#include #include #include using namespace std;class Node {public: int value; Node *left, *right; Node(int _value... 阅读全文
posted @ 2014-03-10 18:32 SangS 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 总结1. Objects in a set are immutable; if you want to modify an object, you need to:a. make a copy of the object from the setb. modify the copyc. remove the original object from the object, andd. insert the copy into the set2. Each associative container is parameterized on Key and an ordering relation 阅读全文
posted @ 2014-03-10 16:37 SangS 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 题目描述: 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可思路1. 朴素背包问题2. 假设 dp[i][j] 表示前 i 件物品拼成 j 分的最少邮票数dp[i][j] = min(dp[i-1][j], dp[i-1][j-value[i]]+1)3. 转化成一维背包 dp[v] = min(dp[v], dp[v-value[i]]+1)代码 未通过九度测试#include #include #include using namespace std;const int INF .. 阅读全文
posted @ 2014-03-10 15:26 SangS 阅读(331) 评论(0) 推荐(0) 编辑
摘要: 目的:将中缀表达式(即标准形式的表达式)转换为后缀式。例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+转换原则1. 遇到操作数, 直接输出2. 操作符的优先级为 () 最大, * / 次之, +- 最小. 遇到操作符后, 假如操作符堆栈为空, 则直接压入操作符, 否则判断当前操作符与栈顶操作符的优先关系, 假如栈顶操作符的优先级大于 等于当前操作符的优先级, 那么弹出栈顶操作符, 持续弹出, 直到栈顶操作符优先级小于当前操作符优先级或栈为空. 最后将当前操作符入栈3. 如果遇到右括号, 那么将栈顶操作符弹出, 持续弹出直到遇到左括号, 左括号弹出但不输出4. 表达式读入完毕 阅读全文
posted @ 2014-03-10 14:47 SangS 阅读(4808) 评论(1) 推荐(0) 编辑