(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一定增加。

 package org.xiu68.ch04.ex12;

 public class Ex4_21 {

     public static void main(String[] args) {
// TODO Auto-generated method stub double max=10000000; double[][] edges=new double[][]{
{1,10,5,3},
{0.05,1,0,5},
{0.1,0,1,2},
{0.01,0.15,0.1,1}
};
MGraph1 m1=new MGraph1(edges);
m1.bellmanFord(0, 3);
//输出
/*
1个第0种货币最多可以兑换50.0个第3种货币
不存在异常情况
*/ double[][] edges1=new double[][]{
{1,10,5,3},
{0.05,1,0,5},
{0.1,0,1,2},
{0.2,0.15,0.1,1}
};
MGraph1 m2=new MGraph1(edges1);
m2.bellmanFord(0, 3);
//输出
/*
1个第0种货币最多可以兑换5000.0个第3种货币
存在异常情况
*/
} } class MGraph1{
private double[][] edges; //有向图边集
private int vexNum; //顶点数目
private double[] money; //money[i]表示用一个s币可以兑换多少i币 public MGraph1(double[][] edges){
this.edges=edges;
this.vexNum=edges.length;
this.money=new double[vexNum];
} public void bellmanFord(int s,int t){
//初始化money数组
for(int i=0;i<vexNum;i++){
money[i]=0;
}
money[s]=1; for(int i=1;i<vexNum;i++){ //从源点到任何一个顶点最多有vexNum条边的最短路径
boolean flag=false; //记录在本次循环中从源点到某个顶点是否有更短的路径
//遍历所有的边
for(int j=0;j<vexNum;j++){
for(int k=0;k<vexNum;k++){
if(edges[j][k]!=0 && money[k]<money[j]*edges[j][k]){
money[k]=money[j]*edges[j][k];
flag=true;
}
}
}
if(flag==false) //已经求得所有顶点最多edgeNum条边的最短路径
break;
} System.out.println("1个第"+s+"种货币最多可以兑换"+money[t]+"个第"+t+"种货币"); boolean flag=false;
for(int i=0;i<vexNum;i++){
for(int j=0;j<vexNum;j++){
if(Math.abs(edges[i][j])!=0 && money[j]<money[i]*edges[i][j]){
flag=true;
}
}
}
if(flag==false)
System.out.println("不存在异常情况");
else
System.out.println("存在异常情况");
System.out.println();
}
}

Ex4_21 最短路径算法可以应用于货币交易领域..._第十二次作业的更多相关文章

  1. Ex 4_10 给定一个有向图G=(V,E),其中边...(bellman-ford算法的应用).._第十二次作业

    在bellman-ford算法中,循环n-1(n为顶点个数)次可以找出从源点到其他顶点的最多n-1条边的最短路径,若循环k次则可以找出从源点到其他顶点的最多k条边的最短路径. package org. ...

  2. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼

    https://vjudge.net/contest/68966#problem/G 正解一: http://www.clanfei.com/2012/04/646.html #include< ...

  3. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 F - Piggy-Bank 【完全背包问题】

    https://vjudge.net/contest/68966#problem/F http://blog.csdn.net/libin56842/article/details/9048173 # ...

  4. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 E - Super Jumping! Jumping! Jumping!

    https://vjudge.net/contest/68966#problem/E http://blog.csdn.net/to_be_better/article/details/5056334 ...

  5. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana

    https://vjudge.net/contest/68966#problem/C [参考]http://blog.csdn.net/qinmusiyan/article/details/79862 ...

  6. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 B - Ignatius and the Princess IV

    http://www.cnblogs.com/joeylee97/p/6616039.html 引入一个cnt,输入元素与上一个元素相同,cnt增加,否则cnt减少,当cnt为零时记录输入元素,因为所 ...

  7. 算法导论(Introduction to Algorithms )— 第十二章 二叉搜索树— 12.1 什么是二叉搜索树

    搜索树数据结构支持很多动态集合操作,如search(查找).minmum(最小元素).maxmum(最大元素).predecessor(前驱).successor(后继).insert(插入).del ...

  8. Alink漫谈(十二) :在线学习算法FTRL 之 整体设计

    Alink漫谈(十二) :在线学习算法FTRL 之 整体设计 目录 Alink漫谈(十二) :在线学习算法FTRL 之 整体设计 0x00 摘要 0x01概念 1.1 逻辑回归 1.1.1 推导过程 ...

  9. Johnson 全源最短路径算法

    解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...

随机推荐

  1. MySQL随记(一)

    数据类型 Insert Update Delete 函数

  2. HttpService

    // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...

  3. javascript文件加载模式与加载方法

    加载方式 形象图像化方法,见 http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html 1. script标签, ...

  4. 《Python数据可视化编程实战》

    第一章:准备工作环境 WinPython-32bit-3.5.2.2Qt5.exe 1.1 设置matplotlib参数 配置模板以方便各项目共享 D:\Bin\WinPython-32bit-3.5 ...

  5. Codeforces Round #536 (Div. 2)

    前言 如您所见这又是一篇咕了的文章,直接咕了10天 好久没打CF了 所以还是个蓝名菜鸡 机房所有人都紫名及以上了,wtcl 这次前4题这么水虽然不知道为什么花了1h,结果不知道为什么搞到一半出锅了,后 ...

  6. 第25月第18天 vue

    1.cnpm sudo chown -R $USER /usr/local  npm install -g cnpm --registry=https://registry.npm.taobao.or ...

  7. python后端从数据库请求数据给到前端的具体实现

    先来贴一窜代码让大家理解前端/后端/数据库的工作原理, 首先简要说明:前端向后端请求数据,后端根据前端请求数据的类别分析其需求,并连接到数据库获取相应数据: 来一段简单的实例代码模拟淘宝商城: 前端代 ...

  8. json对象转数组

    <script type="text/javascript"> var object = {"a":1,"b":2," ...

  9. 页面跳转、底部tabs切换页面

    1.页面跳转 import { NavController } from 'ionic-angular'; constructor(public navCtrl: NavController) { } ...

  10. Django学习手册 - 创建Django工程项目以及APP

    前置步骤: 下载python,django 并且安装好 python 解释器以及django模块. 整体步骤阐述: 创建django工程项目 步骤一:进入安装的python目录 步骤二:输入创建工程的 ...