最短路
POJ 2253 Frogger
题面
思路
要求单次跳跃的最长距离最短,建图之后,即求起点到终点的路径中,路径经过的边的最大值最小,贪心来看,对 d i j k s t r a dijkstra dijkstra算法变形,每次更新时取路径上边的最大值,选择更新点则是选择当前集合中最大值最小的点来进行更新即可。
POJ 1797 Heavy Transportation
题面
思路
与 P O J 2253 POJ2253 POJ2253相反,建图之后,求起点到终点的路径中,路径经过的边的最小值最大,贪心来看,对 d i j k s t r a dijkstra dijkstra算法变形,每次更新时取路径上边的最小值,选择更新点则是选择当前集合中最小值最大的点来进行更新即可。
POJ 3268 Silver Cow Party
题面
思路
建立反图,对正图和反图均跑一遍以 x x x为起点的 d i j k s t r a dijkstra dijkstra算法,可以得到对于每个点 i i i, i i i到 x x x的距离 d i s i , x dis_{i,x} disi,x最小值和 x x x到 i i i的距离最小值 d i s x , i dis_{x,i} disx,i,取 m i n ( d i s i , x + d i s x , i ) ( 1 < = i < = n ) min(dis_{i,x}+dis_{x,i})(1<=i<=n) min(disi,x+disx,i)(1<=i<=n)即可。
POJ 1860 Currency Exchange
题面
思路
建图,以 s s s为起点跑 s p f a spfa spfa,只需判断图中有无正环即可,枚举每条边,若存在某条 x x x到 y y y的边, d i s y < ( d i s x − c ) ∗ r dis_y<(dis_x-c)*r disy<(disx−c)∗r,说明图中存在正环,可以使资金不断增多,即输出 Y E S YES YES,反之,输出 N O NO NO。
POJ 3259 Wormholes
题面
在探索他的许多农场时,农夫约翰发现了许多惊人的虫洞。虫洞非常奇特,因为它是一条单向路径,可以在您进入虫洞之前的时间将您送到目的地!约翰的每个农场都包括 N ( 1 ≤ N ≤ 500 ) N(1≤N ≤ 500) N(1≤N≤500)个字段,编号为 1.. N 1..N 1..N, M ( 1 ≤ M ≤ 2500 ) M(1≤M≤2500) M(1≤M≤2500)路径和 W ( 1 ≤ W ≤ 200 ) W(1≤W≤200) W(1≤W≤200)虫洞。
由于约翰是一个狂热的时间旅行粉丝,他想做以下事情:从某个领域开始,穿过一些路径和虫洞,并在他最初离开之前返回起点。也许他能见到自己.
为了帮助约翰了解这是否可能,他将为您提供他农场 F ( 1 ≤ F ≤ 5 ) F(1≤F≤5) F(1≤F≤5)的完整地图。没有路径的行进时间会超过 10 , 000 10,000 10,000 秒,也没有虫洞可以让 约翰 回到超过 10 , 000 10,000 10,000 秒。
思路
建图,用建立超级源点 s s s,对于图上每个点 i i i,都连一条 s s s到 i i i的权值为 0 0 0有向边,以 s s s为起点跑一遍 s p f a spfa spfa判断图中有无负环即可。
POJ 3660 Cow Contest
题面
思路
建图,若 a a a可以战胜 b b b,则连接一条 a a a到 b b b的有向边,权值设为 1 1 1即可,对于每个点跑 d i j k s t r a dijkstra dijkstra或者直接跑 f l o y d floyd floyd,求出每两个点之间的最短路,若对于某只奶牛 i i i, i i i与其他每只奶牛之间都存在单向路径,即满足 ( d i s i , j ! = i n f ∣ d i s j , i ! = i n f ) ( 1 < = j < = n ) (dis_{i,j}!=inf|dis_{j,i}!=inf)(1<=j<=n) (disi,j!=inf∣disj,i!=inf)(1<=j<=n),这只奶牛的战斗力就可以被确定。
POJ 2240 Arbitrage
题面
套利是利用货币汇率的差异将一个货币单位转换为多个单位的相同货币。例如,假设 1 1 1 美元买入$ 0.5 $英镑, 1 1 1 英镑买入$ 10.0 $法国法郎, 1 1 1 法郎买入 0.21 美元。然后,通过转换货币,聪明的交易者可以从 1 1 1 美元开始买入 $0.5 * 10.0 * 0.21 = 1.05 美元,获利 美元,获利 美元,获利 5$%。
你的工作是编写一个程序,将货币汇率列表作为输入,然后确定套利是否可能。
思路
建图,对于每个点为起点跑一遍 b e l l m a n f o r d bellman ford bellmanford或者 s p f a spfa spfa或者 d i j k s t r a dijkstra dijkstra,起点的值可以自己赋成任意正数(赋值为 1 1 1即可),判断是否存在正环即可,只要有一个点为起点的连通图中存在正环,即可以套利。判断方法与 P O J 1860 POJ1860 POJ1860一致。
POJ 1511 Invitation Cards
题面
POJ 3159 Candies
题面
思路
差分约束, x a + c > = x b x_a+c>=x_b xa+c>=xb,连接一条从 a a a到 b b b的权值为 c c c的边,以 1 1 1为起点跑单源最短路,得到的 d i s n dis_n disn即答案。
POJ 1062 昂贵的聘礼
题面
年轻的探险家来到了一个印第安部落里。
在那里他和酋长的女儿相爱了,于是便向酋长去求亲。
酋长要他用 10000 10000 10000个金币作为聘礼才答应把女儿嫁给他。
探险家拿不出这么多金币,便请求酋长降低要求。
酋长说:”嗯,如果你能够替我弄到大祭司的皮袄,我可以只要 8000 8000 8000金币。如果你能够弄来他的水晶球,那么只要 5000 5000 5000金币就行了。”
探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。
探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。
不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。
探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。
另外他要告诉你的是,在这个部落里,等级观念十分森严。
地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。
他是一个外来人,所以可以不受这些限制。
但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。
因此你需要在考虑所有的情况以后给他提供一个最好的方案。
为了方便起见,我们把所有的物品从 1 1 1开始进行编号,酋长的允诺也看作一个物品,并且编号总是 1 1 1。
每个物品都有对应的价格 P P P,主人的地位等级 L L L,以及一系列的替代品 T i T_i Ti 和该替代品所对应的”优惠” V i V_i Vi。
如果两人地位等级差距超过了 M M M,就不能”间接交易”。
你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。
思路
建图,每个物品均为图上的点,物品与物品之间的”差价“即为边权,建立源点 0 0 0,在 0 0 0与每个物品建连一条权值为物品价值的边。
枚举所有的可能的等级范围,对于在该等级范围内的点生成的子图跑以 0 0 0为起点的单源最短路。
对所有得到的 d i s 1 dis_1 dis1,取最小值作为答案。
HDU 4725 The Shortest Path in Nya Graph
题面
思路
在相邻层之间建立虚拟源点 s s s,对于下层所有节点 i i i,连接 i i i到 s s s的边权为 c c c的有向边,连接 s s s到 i i i的边权为 0 0 0的有向边,对于上层所有节点 j j j,连接 j j j到 s s s的边权为 c c c的有向边,连接 s s s到 j j j的边权为 0 0 0的有向边,这样建图即可保证题目的要求,也使得边数为 O ( m + n ) O(m+n) O(m+n),再以 1 1 1为起点跑一遍堆优化的 d i j k s t r a dijkstra dijkstra即可。
HDU 4370 0 or 1
题面
思路
分析题意,将矩阵 C C C看作无向图的邻接矩阵,即可分析出所求答案是一些路径的值,必须满足路径上点 1 1 1的出度为 1 1 1,点 n n n的入度为 1 1 1。贪心来看,只需要求 1 1 1到 n n n的最短路径 d i s 1 dis_1 dis1,包含点 1 1 1的自环 d i s 2 dis_2 dis2,包含点 n n n的自环 d i s 3 dis_3 dis3,答案即为 m i n ( d i s 1 , d i s 2 + d i s 3 ) min(dis_1,dis_2+dis_3) min(dis1,dis2+dis3)。
POJ 3169 Layout
题面
像其他人一样,奶牛在排队取饲料时喜欢站在朋友身边。 F J FJ FJ有 N ( 2 < = N < = 1 , 000 ) N(2<= N <= 1,000) N(2<=N<=1,000)头编号为 1... N 1...N 1...N的奶牛站在一条直线上等待饲料。奶牛站立的顺序与编号的顺序相同,并且由于它们可能相当咄咄逼人,因此两头或多头奶牛可能会在完全相同的位置排队(也就是说,如果我们认为每头奶牛位于数线上的某个坐标处,那么两头或多头奶牛可以共享相同的坐标)。
有些奶牛互相喜欢,希望彼此在一定距离内排队。有些人真的不喜欢对方,希望至少相隔一定距离 M L ( 1 < = M L < = 10 , 000 ) ML (1 <= ML <= 10,000) ML(1<=ML<=10,000)约束列表描述了哪些奶牛彼此喜欢以及它们可以分开的最大距离;随后的 M D MD MD个约束列表 ( 1 < = M D < = 10 , 000 ) (1 <= MD <= 10,000) (1<=MD<=10,000)告诉哪些奶牛彼此不喜欢以及它们必须分开的最小距离。
如果可能,您的工作是计算奶牛 1 1 1和奶牛 N N N之间满足距离约束的最大可能距离。
思路
差分约束,求最大可能距离,对于某个约束条件,化为 x j < = x i + w x_j<=x_i+w xj<=xi+w的形式,连接 x i x_i xi到 x j x_j xj的权值为 w w w的有向边,对于全图跑单源最短路即可求出答案
注意:图中含有负权边,可能存在负环,不可以用 d i s k t r a disktra disktra算法,可以使用 b e l l m a n f o r d bellman ford bellmanford或者 s p f a spfa spfa。