2017.6.6测试 题二 过路费


过 路 费

提交文件:rate.exe

输入文件:rate.in

输出文件:rate.out

问题描述:

古时候有N个城市,编号分为1到N,每两个城市之间有且只有一条路。商人在城市之前做买卖时就会遇到一个问题,那就是每通过一条路,就要支付一定的过路费,这个过路费等于商人身上的金钱数乘以一个不大于1的小数,并且这个小数会因道路的不同而不同。商人想从城市A去到城市B,问最多可以剩下多少钱。

输入格式:

输入的第一行包含三个整数,分别是城市数N,起点城市A以及目标城市B。
接下来的N行各包含N个范围是[0, 1]的小数。矩阵第I行第J列的小数表示从城市I直接到城市J时收取的过路费与身上金钱数的比值。该矩阵是非对称的,且对角线上的数都是0。

输出格式:

输出只有一行,包含一个小数,表示从城市A到城市B后最多剩下的金钱数与初始金钱数的比值。

输入样例:

3 1 3
0.00 0.10 0.20
0.10 0.00 0.10
0.30 0.20 0.00

输出样例:

0.81

数据范围:

对于50%的数据,3 ≤ N ≤ 100;
对于所有的数据,3 ≤ N ≤ 500,1 ≤ A,B ≤ N,A ≠ B。

var
m:array[0..500,0..500]of real;
f:array[0..500]of real;
v:array[0..500]of boolean;
n,x,a,b,i,j,k:longint;
maxn:real;
function max(a,b:real):real;
begin
if a>b then exit(a);
exit(b);
end;
begin
readln(n,a,b);
for i:=1 to n do
for j:=1 to n do
begin
read(m[i,j]);
if i<>j then m[i,j]:=1-m[i,j];//设钱为1,m[i,j]是过路费和钱的比值,所以1-1*m[i,j]为过路费
end;
for i:=1 to n do
f[i]:=m[a,i];//初始化
fillchar(v,sizeof(v),true);//初始化~
v[a]:=false;//出发点不用去
f[a]:=0;//出发点不用钱~
for i:=1 to n do
begin
maxn:=-233;//比大,赋小值
k:=0;//初始化了啦
for j:=1 to n do
if (f[j]>maxn) and (v[j]) then//走这条路可以省更多钱,而且可以走就走咯~
begin
maxn:=f[j];
k:=j;//k记录最省钱的点
end;
if k<>0 then
begin
v[k]:=false;//走过了
for j:=1 to n do
if v[j] then f[j]:=max(f[j],f[k]*m[k,j]);//更新走过的比值
end;
end;
writeln(f[b]:0:2);//1比任何数,都还是那个数
end.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值