zoukankan      html  css  js  c++  java
  • Ex4_21 最短路径算法可以应用于货币交易领域..._第十二次作业

    (a)   建立一个有向图G(V,E),每个顶点表示一种货币,两个顶点之间的边权的大小ex[u][v]表示两种货币之间的汇率,若要找一个最有利的兑换序列,把货币s兑换成货币t,即在若干种兑换序列中选择一条合适的兑换序列,将等量货币s尽可能多的兑换货币t,令money[x]表示一个s币可以兑换多少个x币。初始时令money[s]=1,money[x]=0.利用bellman-ford算法,修改算法中的update过程如下

    do for each edge (u, v) ∈ E[G]

           if(money[v]<money[u]*ex[u][v])

           money[v]=money[u]*ex[u][v]

    如果不存在异常情形,则兑换的最长路径最多有n-1条边(n为货币的种数).

    (b)   若存在异常情形,则在求得最多n-1条边的基础上再进行依次update操作,某个顶点的money一定增加。

     1 package org.xiu68.ch04.ex12;
     2 
     3 public class Ex4_21 {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         
     8         double max=10000000;
     9         
    10         double[][] edges=new double[][]{
    11             {1,10,5,3},
    12             {0.05,1,0,5},
    13             {0.1,0,1,2},
    14             {0.01,0.15,0.1,1}
    15         };
    16         MGraph1 m1=new MGraph1(edges);
    17         m1.bellmanFord(0, 3);
    18         //输出
    19         /*
    20         1个第0种货币最多可以兑换50.0个第3种货币
    21         不存在异常情况
    22         */
    23         
    24         double[][] edges1=new double[][]{
    25             {1,10,5,3},
    26             {0.05,1,0,5},
    27             {0.1,0,1,2},
    28             {0.2,0.15,0.1,1}
    29         };
    30         MGraph1 m2=new MGraph1(edges1);
    31         m2.bellmanFord(0, 3);
    32         //输出
    33         /*
    34         1个第0种货币最多可以兑换5000.0个第3种货币
    35         存在异常情况
    36         */
    37     }
    38 
    39 }
    40 
    41 class MGraph1{
    42     private double[][] edges;    //有向图边集
    43     private int vexNum;            //顶点数目
    44     private double[] money;        //money[i]表示用一个s币可以兑换多少i币
    45     
    46     public MGraph1(double[][] edges){
    47         this.edges=edges;
    48         this.vexNum=edges.length;
    49         this.money=new double[vexNum];
    50     }
    51     
    52     public void bellmanFord(int s,int t){
    53         //初始化money数组
    54         for(int i=0;i<vexNum;i++){
    55                 money[i]=0;
    56         }
    57         money[s]=1;
    58         
    59         for(int i=1;i<vexNum;i++){                //从源点到任何一个顶点最多有vexNum条边的最短路径
    60             boolean flag=false;                    //记录在本次循环中从源点到某个顶点是否有更短的路径
    61             //遍历所有的边
    62             for(int j=0;j<vexNum;j++){            
    63                 for(int k=0;k<vexNum;k++){
    64                     if(edges[j][k]!=0 && money[k]<money[j]*edges[j][k]){
    65                         money[k]=money[j]*edges[j][k];
    66                         flag=true;
    67                     }
    68                 }
    69             }
    70             if(flag==false)        //已经求得所有顶点最多edgeNum条边的最短路径
    71                 break;
    72         }
    73         
    74         System.out.println("1个第"+s+"种货币最多可以兑换"+money[t]+"个第"+t+"种货币");
    75 
    76         boolean flag=false;
    77         for(int i=0;i<vexNum;i++){
    78             for(int j=0;j<vexNum;j++){
    79                 if(Math.abs(edges[i][j])!=0 && money[j]<money[i]*edges[i][j]){
    80                     flag=true;
    81                 }
    82             }
    83         }
    84         if(flag==false)
    85             System.out.println("不存在异常情况");
    86         else
    87             System.out.println("存在异常情况");
    88         System.out.println();
    89     }
    90 }
    View Code
  • 相关阅读:
    单片机 APROM: RAM: Flash:区别
    char (*a) [N]
    strcat的几种实现及性能比较
    sprintf用法
    void (*pFunction)(void);
    16个单片机常用模块电路
    MOS管工作原理
    STM32借用固件库使用外设的说明
    Python之并发编程(二)进程
    Python之并发编程(一)进程和操作系统概述
  • 原文地址:https://www.cnblogs.com/xiu68/p/8000880.html
Copyright © 2011-2022 走看看