最小花费(图论算法)

Description

在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。

Input

第一行输入两个用空格隔开的正整数n和m,分别表示总人数和可以互相转账的人的对数。以下m行每行输入三个用空格隔开的正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费(z<100)。最后一行输入两个用空格隔开的正整数A和B。数据保证A与B之间可以直接或间接地转账。

Output

输出A使得B到账100元最少需要的总费用。精确到小数点后8位。

Sample Input

 

 
   

2 3 2 
1 3 3 
1 3

 

Sample Output

 

 
   

 

Hint

对于所有数据,1<=n<=2000。



解题思路:先读入数据,进行预处理,然后用Dijkstra算法,最后进行统计、对比、输出即可。



程序:

var

  n,m,i,j,x,y,k:longint;

  a:array[0..2001,0..2001]of real;

  dis:array[0..2001]of real;

  v:array[0..2001]of boolean;

  max:real;

begin

  readln(n,m);

  for i:=1 to m do

    begin

      readln(j,k,a[j,k]);

      a[j,k]:=(100-a[j,k])/100;

      a[k,j]:=a[j,k];

    end;

  readln(x,y);

  for i:=1 to n do

    dis[i]:=a[x,i];

  dis[x]:=1;

  v[x]:=true;

  for i:=1 to n-1 do

    begin

      max:=0;

      for j:=1 to n do

        if not v[j] and (dis[j]>max) then

          begin

            max:=dis[j];

            k:=j;

          end;

      v[k]:=true;

      for j:=1 to n do

        if not v[j] and (dis[k]*a[k,j]>dis[j]) then dis[j]:=dis[k]*a[k,j];

    end;

  writeln(100/dis[y]:0:8);

end.


版权属于: Chris

原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0yb.html

转载时必须以链接形式注明原始出处及本声明。

你可能感兴趣的:(图论算法)