poj 1860 Currency Exchange bellman
2016-04-15 19:43
302 查看
题目大意
有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100
- 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加,因为货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路。
分析
就是要求有没有正环,用bellman求最长路,经过n次松弛后如果还可以松弛,那就有正环,输出YES。
注意
要把每种汇币当做点,把交换当做边,权值为一个函数:(现在有的钱-手续费)*汇率
代码
const
maxe=10000;
maxv=20000;
type
arr=record
x,y:longint;
w,t:real;
end;
var
n,m,f:longint;
s:real;
a:array[1..maxv] of arr;
d:array[1..maxe] of real;
i,j,k:longint;
procedure relax(u,v:longint;w,t:real);
var
i:real;
begin
i:=(d[u]-t)*w;
if i>d[v] then
d[v]:=i;
end;
function bellman:boolean;
var
i,j:integer;
k:real;
begin
for i:=1 to n do
for j:=1 to m do
with a[j] do relax(x,y,w,t);
for i:=1 to m do
with a[i] do
begin
k:=(d[x]-t)*w;
if k>d[y] then exit(true);
end;
exit(false)
end;
begin
readln(n,m,f,s);
fillchar(a,sizeof(a),0);
fillchar(d,sizeof(d),0);
for j:=1 to m do
begin
with a[j*2-1] do
read(x,y,w,t);
a[j*2].x:=a[j*2-1].y;
a[j*2].y:=a[j*2-1].x;
with a[j*2] do
read(w,t);
end;
m:=m*2;
d[f]:=s;
if bellman
then writeln('YES')
else writeln('NO');
end.
有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100
- 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加,因为货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路。
分析
就是要求有没有正环,用bellman求最长路,经过n次松弛后如果还可以松弛,那就有正环,输出YES。
注意
要把每种汇币当做点,把交换当做边,权值为一个函数:(现在有的钱-手续费)*汇率
代码
const
maxe=10000;
maxv=20000;
type
arr=record
x,y:longint;
w,t:real;
end;
var
n,m,f:longint;
s:real;
a:array[1..maxv] of arr;
d:array[1..maxe] of real;
i,j,k:longint;
procedure relax(u,v:longint;w,t:real);
var
i:real;
begin
i:=(d[u]-t)*w;
if i>d[v] then
d[v]:=i;
end;
function bellman:boolean;
var
i,j:integer;
k:real;
begin
for i:=1 to n do
for j:=1 to m do
with a[j] do relax(x,y,w,t);
for i:=1 to m do
with a[i] do
begin
k:=(d[x]-t)*w;
if k>d[y] then exit(true);
end;
exit(false)
end;
begin
readln(n,m,f,s);
fillchar(a,sizeof(a),0);
fillchar(d,sizeof(d),0);
for j:=1 to m do
begin
with a[j*2-1] do
read(x,y,w,t);
a[j*2].x:=a[j*2-1].y;
a[j*2].y:=a[j*2-1].x;
with a[j*2] do
read(w,t);
end;
m:=m*2;
d[f]:=s;
if bellman
then writeln('YES')
else writeln('NO');
end.
相关文章推荐
- ArcGIS Runtime SDK for iOS(四) ---使用geometry的原始数据重绘折线
- hdu HDU Today2112
- POJ-3100-Root of the Problem,原来是水题,暴力求解~~~
- TableViewCell的点击打钩
- iOS APP上架流程
- sass不支持GBK
- nyoj166-小珂的数学题
- linux下网站数据和数据库的备份与恢复
- 在swift中使用自带NSURLConnection请求数据
- 面试题:快排和归并都是基于什么思想的
- 基因数据处理19之BWA匹配算法串产生、匹配、评价等整体流程
- iOS小技巧 - ARC与非ARC的混合开发
- 实验三 白盒测试
- 1. Python快速入门
- iOS应用运行时在设置中更改权限应用崩溃问题
- 一些常用算法的代码(1)
- 2016sdau课程练习专题二 1002
- Java中的抽象和封装
- Java第五次作业
- 成员函数 友元函数 和 一般函数的区别