A - Til the Cows Come Home
最短路模板,从终点到起点,双向建边
/***********************************************
* Author: fisty
* Created Time: 2015/1/28 20:55:21
* File Name : 4_A.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
B -Frogger
题目大意:
给出两只青蛙的坐标A、B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的。显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。
现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离。
Floyd算法
用Floyd算法求出两两最短路,再求出从每个点开始的最长路,最后从这n个最长路中求出最小的那个即为所求。
/***********************************************
* Author: fisty
* Created Time: 2015/1/29 10:55:02
* File Name : 4_B.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
C - Heavy Transportation
和上个题要求的正好相反,求最短路径的一条边最小承载量,这里出发点要特殊处理,因为d[s] = 0;之后的点只要d[v] < d[u] && d[v] < cost就可用d[v] = min(d[u], cost)来推了,用的dijsktra,Floyd会超时
/***********************************************
* Author: fisty
* Created Time: 2015/1/30 11:03:39
* File Name : 4_C.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
D -
Silver Cow Party
1.求i( 1<= i <=n)到X的最短路径,保存在d_1[i]
2.求X到所有i(1 <= i <= n)的最短路,保存在d_2[i]
3求一条最长的最短路 ans = max(ans, d_1[i] + d_2[i]) (1 <= i <= n)
/***********************************************
* Author: fisty
* Created Time: 2015/1/30 17:51:30
* File Name : 4_D.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
E - Currency Exchange
题目大意
有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费
是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加
货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路,且最后得到的s金额是增加的
怎么找正权回路呢?(正权回路:在这一回路上,顶点的权值能不断增加即能一直进行松弛)
题解链接