15th 【最短路 dijkstra】最小花费

2023-05-16

                                                                                             最小花费

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



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


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


【约定】
对于所有数据,1<=n<=2000。


【样例输入】
3 3
1 2 1
2 3 2
1 3 3
1 3


【样例输出】

 103.07153164 

这是一道求最短路径的题目

我觉得迪杰斯特拉算法还是很好理解的。

用f[i]表示从起点到第i个点的最短距离。

那么以该点为中心穷举每个没有遍历点 如果 a[i][j]+f[i]<f[j]

那么就替换 F[i]=a[i][j]+f[i]


那么如何确定每个点的最短距离f[i]呢

贪心思路是很完美的

首先从起点开始,搜索到一个最近的点,比如是第k个点,那么f[k]一定是最优的了。

那么以k为中心点,对于其他所有点进行松弛操作,就是上一段的操作,

这样就一定有一个点被松弛到最优了 ,所以再从没有遍历的点中找到一个f[p]最小的p点,该点距离一定是最优值了,所以遍历该点

然后再以p为中心,进行松弛操作。。。。。


这里这题首先需要一个处理,把它变成百分比,也就是每条边的权值,总的结果越大越好。

这里需要注意,这个百分比是要乘的,最后用100除以实际的百分比就是要花的钱了!

#include <iostream>  
#include <cstring>  
#include <cstdio>  
#include <algorithm>  
#include <cmath>
using namespace std;  
int inf=-2147483647;
int n,m,p,q;
double a[2005][2005];
double  f[2005];
int  book[2005];

int main()  
{     //freopen("test1.in","r",stdin);
      //freopen("test1.out","w",stdout); 
      int x,y;
      double z;
      cin>>n>>m;
      for(int i=1;i<=m;i++)
      {cin>>x>>y>>z;
       a[x][y]=1.00-z/100;
       a[y][x]=a[x][y];
       //printf("a[%d][%d]=a[%d][%d]=%.2f\n",x,y,y,x,a[x][y]);
      }
      cin>>p>>q;
      book[p]=1;
      for(int i=1;i<=n;i++)  f[i]=a[p][i];
      for(int i=2;i<=n;i++)
      {      double mx=0;
             int now;
            for(int j=1;j<=n;j++)
                if(book[j]!=1&&f[j]>mx)
                  {mx=f[j];
                   now=j;}//寻找点
             book[now]=1;//标记为已遍历
             for(int j=1;j<=n;j++)
              if(f[now]*a[now][j]>f[j]&&book[j]!=1)      
                 f[j]=f[now]*a[now][j];//松弛操作
            }
        printf("%.8f\n",100/f[q]);
     return 0;  
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15th 【最短路 dijkstra】最小花费 的相关文章

  • Dijkstra算法——java实现

    面试时遇到Dijkstra算法 这个算法我是知道的 但是没具体写过 所以答题比较慢 抽时间实现了下这个算法 nbsp Dijkstra算法基本思路 该算法的基本思路是这样的 从起始点开始 将未访问过的相邻节点加入一个优先队列 类似于广度优先
  • TT 的旅行日记(Dijkstra)

    问题描述 xff1a 众所周知 xff0c TT 有一只魔法猫 今天他在 B 站上开启了一次旅行直播 xff0c 记录他与魔法猫在喵星旅游时的奇遇 TT 从家里出发 xff0c 准备乘坐猫猫快线前往喵星机场 猫猫快线分为经济线和商业线两种
  • 机器人路径规划之Dijkstra算法

    在机器人路径规划之动态窗口法文中 xff0c 介绍了一种局部路径规划方法 动态窗口法 xff0c 本文将介绍一种全局路径规划方法 Dijkstra算法 狄克斯特拉算法 Dijkstra算法是从一个顶点到其余各顶点的最短路径算法 xff0c
  • 2、无人驾驶--路径规划算法:Dijkstra

    目录 2 Dijkstra2 1 算法简介2 2 算法思路具体流程 xff1a 2 3 算法具体实现2 3 1 程序详解 2 Dijkstra 声明 xff1a 本文是学习古月居 基于栅格地图的机器人路径规划算法指南 黎万洪 后写的笔记 x
  • 数据结构——迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉算法又叫狄克斯特拉算法 是从一个顶点到其余各顶点的最短路径算法 解决的是有权图中最短路径问题 迪杰斯特拉算法主要特点是从起始点开始 采用贪心算法的策略 每次遍历到始点距离最近且未访问过的顶点的邻接节点 直到扩展到终点为止 以下是数
  • 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法 Dijkstra 是由荷兰计算机科学家狄克斯特拉于1959年提出的 因此又叫狄克斯特拉算法 迪杰斯特拉 Dijkstra 算法是最经典的最短路径算法之一 用于计算一个结点到其他结点的最短路径 它的
  • 最短路径A*算法原理及java代码实现(看不懂是我的失败)

    算法只要懂原理了 代码都是小问题 先看下面理论 尤其是红色标注的 要源码请留下邮箱 有测试用例 直接运行即可 A 算法 百度上的解释 A 1 A Star 算法是一种静态路网中求解最短路最有效的直接搜索方法 公式表示为 f n g n h
  • 健康损失的迷宫中的最短路径

    假设您有一个由 2D 矩阵表示的地下城 您有一个起点 S x1 y1 和一个终点 E x2 y2 在此过程中 一些细胞中会有一个数字 这些数字会从您的健康得分中减去 其他细胞是你无法跨越的障碍 你一开始有 5 点生命值 你需要找到从 S 到
  • Java:使用 Fibonacci 堆实现 Dijkstra 算法

    新来的 但已经作为客人潜伏了一段时间了 好的 所以我一直在尝试使用 Fibonacci 堆 在 Java 中 执行 Dijkstra 的最短路径算法 经过一番搜索 我偶然发现了两个代表斐波那契堆的现成实现 第一个实现做得相当漂亮 可以找到h
  • 如何使用 A-Star 或 Dijkstra 算法解决 15 个难题?

    我在一本人工智能书籍中读到 用于模拟或游戏中寻路的流行算法 A Star Dijkstra 也被用来解决著名的 15 谜题 谁能给我一些关于如何将 15 个拼图简化为节点和边图的指示 以便我可以应用其中一种算法 如果我将图中的每个节点视为游
  • 网格中两点之间的最短路径。有一个捕获

    我遇到这个问题 我必须通过向右或向下移动来找到 NxM 网格中从 A 点 总是左上角 到 B 点 总是右下角 的最短路径 听起来很容易 是吗 问题是 我只能移动我现在坐在的图块上显示的数字 让我举例说明 2 5 1 2 9 2 5 3 3
  • 如何在 Boost Dijkstra 中定义自定义距离?

    我目前正在查看 Boost Dijkstra 的文档 http www boost org doc libs 1 52 0 libs graph doc dijkstra shortest paths html http www boost
  • 具有负权重的 Dijkstra 算法

    我们可以使用具有负权重的 Dijkstra 算法吗 STOP 在你认为 哈哈 你可以在两点之间无休止地跳跃并获得一条无限便宜的路径 之前 我更倾向于考虑单向路径 其应用是具有点的山区地形 显然 从高到低并不需要能量 事实上 它会产生能量 因
  • 具有固定边数的最短路径

    在高效的时间内找到通过图形的最短路径 并附加该路径必须完全包含的约束n nodes 我们有一个有向加权图 它可能包含也可能不包含循环 我们可以使用 Dijkstra 算法轻松找到最短路径 但 Dijkstra 算法不保证边的数量 我们能想到
  • 实施 Dijkstra 算法

    我的任务是 大学课程 实施某种形式的寻路 现在 在规范中 我可以实现强力 因为要搜索的节点数量有限制 开始 中间两个 结束 但我想重新使用此代码并来实现迪杰斯特拉算法 http en wikipedia org wiki Dijkstra
  • 使用字典中的特定键构建列表(python)?

    我正在用 Python 实现 Dijkstra 搜索算法 在搜索结束时 我使用前驱图重建最短路径 从目标节点的前驱开始 例如 path path append destination previous predecessor map des
  • 原始地理坐标和图形节点之间的最短路径

    我已经实现了一个简单的 Dijkstra 算法 用于使用 Java 查找 osm 地图上的最短路径 从 osm 文件创建的图形中的寻路效果非常好 但是 如果用户的当前位置和 或目的地不是该图的节点 只是原始坐标 我们如何将这些坐标 链接 到
  • 为什么使用 Dijkstra 算法而不是最佳(最便宜)优先搜索?

    从我到目前为止所读到的来看 这最佳优先搜索 https en wikipedia org wiki Best first search在找到到达目标的最短路径方面似乎更快 因为 Dijkstra 算法在遍历图时必须放松所有节点 是什么让 D
  • 使用斐波那契堆时 Dijkstra 是否更快?

    使用斐波那契堆时 Dijkstra 是否比使用二进制堆更快 我自己做了一些实现斐波那契堆的实验 并在 Dijkstra 中使用它 我还检查了 fibheap 库中现成的斐波那契堆 但没有一个实现能够更快地找到使用以下命令的最短路径 二进制堆
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph

随机推荐