自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Shuyu Fang

知识分享,相互学习

  • 博客(26)
  • 收藏
  • 关注

原创 POJ2240 套汇(单源最短路径)

给定N种货币以及它们之间的一些兑换率,问是否存在套汇的可能,使某种货币的金钱经过套汇之后变得更多。简单的单源最短路径问题,把每种货币看成一个点,点的初始值只需随便指定一个大于0的数,然后使用bellman-ford算法判定某个点的金钱是否可以无限增多,即是否存在正环。#include #include #include #include using namespace std;

2012-12-12 21:38:48 1890

原创 POJ1860 货币兑换(单源最短路径)

给定N种货币,某些货币之间可以相互兑换,现在给定一些兑换规则,问能否从某一种货币开始兑换,经过一些中间货币之后,最后兑换回这种货币,并且得到的钱比之前的多。可以把初始兑换的货币看成源点,采用bellman-ford进行求解,若可以实现要求,则说明图中存在可以无限增大的环,这个可以通过bellman-ford算法判断环是否存在求出来,若在求解过程中发现已经兑换回原货币,并且钱比之前多,则可以直接

2012-12-12 10:55:03 7476

原创 POJ3615 跨栏最大高度(多源最短路径)

有N个地点,它们之间存在M条单向路径,每条路径中间有一个栏。现在给定一些起点和终点,要求找出它们之间的一条路径,使路径经过的栏的高度的最大值最小。简单的多源最短路径,把路径值变成经过的最大高度值,用FLOYD算法更新每对点之间的最大高度值,然后对于每个起点和终点输出它们之间的最大高度值,若无法从起点到达终点,则输出-1。#include #include #include using

2012-12-11 22:41:23 887

原创 POJ3037 滑雪(单源最短路径)

给定一个M*N的网格,已知在每个网格中的点可以向上下左右四个方向移动一个单位,每个点都有一个高度值,从每个点开始移动时存在一个速度值,从A点移动到B点,则此时B点的速度为"A的速度*2^(A的高度值-B的高度值)",而A点移动到B点所用的时间则是A点开始移动的速度值的倒数。提供网格的长和宽,每个点的高度,以及在左上角的点的出发速度,问从左上角的点到右下角的点最少需要多少时间。由于2^(h1-h

2012-12-10 23:55:12 1787 1

原创 POJ1125 股票经济人通信网络(多源最短路径)

有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内让所有人都接收到消息。若不存在这样一个人,则输出disjoint。简单的多源最短路径问题,用floyd算法求出所有存在的路径,然后对每个人判断是否可以由他来传递以及传递的时间,取最小的那个即可。#include #include #in

2012-12-10 10:17:10 3068

原创 POJ1797 道路可承受的最大重量(单源最短路径变形)

有编号为1-N的地点,它们之间存在一些双向路径,每条路径有它的最大可承受重量,现在要从编号为1的地方向编号为N的地方运送货物。问运送的货物的最大重量。采用类似最短路径的思想,把到达每个点的最短路径变成到达每个点的货物的最大重量,采用dijkstra或spfa运行一遍,把最后一个点的最大重量输出即可。#include #include #include #include using

2012-12-09 22:15:34 1172

原创 POJ1724 价格合适的最短路(广搜BFS)

有编号为1-N的城市,这些城市之间存在一些单向路径,通过某条路径需要支付与路径长度一样的金币。BOB要从城市1到城市N,但他的金币数是有限的,现在要求找出从第1个城市到第N个城市的一条路径,既满足BOB支付得起路费,又满足总路径长度最小。有点类似最短路,但因为有两个约束条件,所以说成广搜更加合适。维护一个优先队列,队列中存放的状态包括到达某个点剩下的金币和走过的路径长度,其中剩下的金币数必须为

2012-12-09 21:31:49 1875

原创 POJ1511 最小总费用(单源最短路径)

有编号为1-N的车站和学生,现在要从第一个车站开始把学生运输到相应的车站,然后把所有学生从相应的车站运回第一个车站,要求运输的总费用的最小值。从第一个车站往其他车站运送学生的最小总费用其实就是以第一个车站为源点的所有最短路径的和。从其他车站运送学生回第一个车站的最小总费用可以通过把所有边逆向之后,再以第一个车站为源点的求所有最短路径的和,因为题目保证可以从任意一个车站去到另一个车站,因此边的方

2012-12-09 00:45:54 980

原创 POJ1062 昂贵的聘礼(单源最短路径+枚举)

有N件物品,每件物品有三种属性(主人的等级、价格、替代品数目),替代品加上较少的金币可以用来交换该物品,但交换过程中最高等级与最低等级不能超过某个数。问为了得到第一件物品,最少需要支付多少钱。可以转换为单源最短路径求解,每条路径由某件物品指向它的替代品,路径长度是优惠的金币数。因为交换过程中等级差不能超过某个数m,因此可以采用枚举等级区间来解决这个问题,每个区间为[a, a+m],a的取值范围

2012-12-08 23:31:30 690

原创 POJ1502 信息传递(单源最短路径)

N个处理器要进行信息传递,处理器i传递信息给自己不需要时间,处理器i与处理器j之间相互传递信息的时间是一样的,不同处理器之间传递信息所需要的时间由一个矩阵的下三角给出。若矩阵对应位置为x,则说明相应的两个处理器之间无法传递信息。求从第一个处理器传递信息到其他所有处理器最少需要多少时间。特殊处理一下值为x的情况,建立邻接阵,运用单源最短路径算法求出第一个处理器到其他所有处理器的最短传递信息时间,

2012-12-08 12:48:00 4418

原创 POJ1135 多米诺效应(单源最短路径+枚举)

有N个关键的多米诺骨牌,这些牌通过一些路径相连接,这些路径是由一排其他骨牌构成的。已知每一条路径上的骨牌倒下需要的时间。现在从把编号为1的关键骨牌推倒,问多长时间后所有的骨牌(包括关键牌和它们之间的路径上的骨牌)都倒下,时间精确到小数点后一位。骨牌可以往两个方向倒,因此路径都是双向的。可以把N个关键牌抽象为N个点,路径抽象为点之间的边。然后通过求单源最短路径的算法求出从第一个关键牌到其他关键牌

2012-12-08 12:23:07 1953

原创 POJ3249 工作难题(DAG有向无环图的单源最短路径)

有N个城市,它们之间存在一些单向路径,若可以从城市i到城市j,则一定无法从城市j到达城市i,只出不入的城市称为源点城市,只入不出的城市称为终点城市。已知到达某个城市就可以获得或者失去一定的钱财。现在狗先生从某个源点出发,到达某个终点停止,他想拥有尽量多的钱财。要求给出最多的钱财是多少。题目给定的是一个有向无环图。最多的钱财可以转换成最短路径问题,每条边的权重其实就是到达该边的终点得到或失去的钱

2012-12-07 20:53:01 1766

原创 POJ2387 最短回家路径(单源最短路径)

给定N个点以及它们之间的一些双向路径,求出从第N个点到第1个点的最短路径。纯粹的单源最短路径题目,图的点最多有1000个,而边最多有2000条(题目数据量不对,数据中可能包含多于2000条边的数据),即边数并没有点数的平方那么多,因此应该考虑使用邻接表存储图,然后采用SPFA或者堆优化的DIJKSTRA求解。#include #include #include using names

2012-12-07 19:01:52 855

原创 POJ3159 最大差距(差分约束系统)

班上有n个同学,现在有一些糖要分给他们,设第i个同学得到的糖为p[i],分糖必须满足条件:第i个同学要求第j个同学的糖不能超过自己k个,即p[j] - p[i] = 0。要求在满足这些条件的情况下,求出p[n] - p[1]的最大值。由p[j] - p[i] 在单源最短路径的算法中有一步是“若mindis[j] > mindis[i] + dis[i][j],则mindis[j] = mi

2012-12-07 12:20:17 3874

原创 POJ3259 回到过去(带负权的单源最短路径)

有N个农场,它们之间有M条普通的双向路径,同时有W条单向“虫洞”,通过普通路径需要花费时间,但通过虫洞却可以回到过去。问能否从任意一个点出发,通过某些普通路径或者“虫洞”再回到起始位置,使到达的时间早于出发的时间。这是带负权的单源最短路径的入门题,按题目给定的边建好图,从任意一点起点开始,使用Bellman-Ford算法运行一遍,判断有没有回路就可以了。#include #include

2012-12-06 22:15:30 820

原创 POJ3268 牛的最长来回时间(单源最短路径)

有编号为1-N的牛,它们之间存在一些单向的路径。给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求这些牛中所花的最长的来回时间是多少。每头牛返回的最短时间很简单就可以算出来,这相当于从目标牛为起点求单源最短路径。但每头牛出发到目标牛的最短时间无法直接算出来,稍微转换一下,发现这个最短时间其实可以通过把所有的边取反向,然后再从目标牛求一次单源最短路径得到。得到这两个最短路径

2012-12-05 21:42:33 4565

原创 POJ1094 字母排序(拓扑排序)

对于N个大写字母,给定它们的一些偏序关系,要求判断出经过多少个偏序关系之后可以确定它们的排序或者存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序。利用拓扑排序即可解决这个问题,但由于题目要求的是经过多少个关系之后就可以确定答案,因此每读入一个关系,就要进行一次拓扑排序,如果某一次拓扑排序之后可以确定它们的唯一排序或者发现冲突存在,则后面的直接略过。若读入所有关系之后依然无法确定唯一关

2012-12-05 16:28:14 4966

原创 POJ3687 球的标签(拓扑排序+优先队列)

给定N个球,这些球的编号分别是1-N中的某个数字,它们的重量也分别是1-N中的某个数字,任意两个球的编号和重量不相等。给定一些类似a这道题是一个拓扑排序问题,把每个编号的球看成一个点,把约束看成点之间的边,构造出一个有向图进行拓扑排序。但由于题目要求输出的答案必须是编号小的球重量尽量轻,因此如果直接拓扑排序,则得到的答案不满足条件。解决的方法是改变每条边的方向,并且使用优先队列来存放入度为

2012-12-04 23:45:15 1760

原创 POJ2367 拓扑排序入门

拓扑排序入门题,此题基本正常的方法都能过,不需要判断是否存在环的情况。#include #include #include using namespace std;const int N = 105;struct Edge{ int pos; int next;};int n;int indeg[N];Edge edge[N * N];int cur;int ne

2012-12-04 21:13:04 1665

原创 优先队列

优先队列是一种特殊的队列,它同样具备入队与出队两种基本操作,但每次出队的元素都是队列中最大(最小)的元素,这里的最大与最小相当于优先级,因此这种队列叫优先队列。优先队列的实现方式不唯一,其中有一种是用堆实现的。对于堆实现的优先队列,它的入队操作相当于在堆的最后一个元素之后加入一个新元素,然后逐步往上浮动直到不需浮动为止;而出队操作则是保存堆顶的元素,然后把堆的最后一个元素放到第一个元素的位置上

2012-12-04 15:56:27 623

原创 常见的字符串哈希函数

const int MOD = 10007;unsigned int RSHash(const char* str){ unsigned int b = 378551; unsigned int a = 63689; unsigned int hash = 0; while (*str) { hash = hash * a + *str++; a *= b; } ret

2012-12-02 00:09:29 1041 2

原创 POJ2002 正方形的个数(二维点的哈希)

给定N个点,求出这些点一共可以构成多少个正方形。若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标。对于特定的A和B坐标,C和D可以在线段AB的左边或者右边,即有两种情况。因此只需要枚举点A和点B,然后计算出两种对应的C和D的坐标,判断是否存在即可。这样计算完之后得到的答案是正确答案的4倍,因为正方形的4条边都枚举了,所以答案要右移两位。

2012-12-01 23:11:12 5563 1

原创 POJ1840 解方程(数的哈希)

给定a1, a2, a3, a4, a5,求符合条件的解(x1, x2, x3, x4, x5)的个数,使得a1*x1^3 + a2*x2^3 + a3*x3^3 + a4*x4^3 + a5*x5^3 = 0。其中-50 x1-x5各有100个可能值,相互的解法是使用5重循环逐一判断,但这样用的时间太长了。因此可以把它们分为两部分(x1, x2)和(x3, x4, x5),求出所有的sum

2012-12-01 20:13:02 828

原创 POJ2785 和为0的组合数(数的哈希)

给定4个组合A,B,C,D,这四个组合里面的元素数目相等。要求找出所有的序列(a, b, c, d),四个数分别来自A,B,C,D四个组合,使得a + b + c + d = 0,输出这样的序列的总数。若两个满足条件的序列是完全相同的,它们也算是不同的序列,因为A,B,C,D中可能含有相同的元素。解题思路很简单,取所有的(a, b)序列进行哈希,以a+b作为键,分别映射到非负数和负数两个哈希表

2012-12-01 17:12:32 1031

原创 POJ3274 牛的属性和(数的哈希)

给定多头牛的属性,每头牛的属性由一个非负数表示,该数的二进制表示不会超过K位,它的二进制表示的每一位若为1则表示该牛有对应的第i种属性,若为0则表示没有该属性。对于给定的牛的顺序,要求输出某一段子序列的长度,这个子序列中的牛的K个属性对应相加以后全部相等。假设n=3, k = 3输入的3个数变成的二进制分别为(a1, a2, a3), (b1, b2, b3), (c1, c2, c3

2012-12-01 16:02:48 3393 1

原创 USACO历年比赛的数据和解题报告

http://ace.delos.com/MAR07 表示07年三月的比赛,把最后的部分改成”月份+年份“就可以了

2012-12-01 15:43:45 3115 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除