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

输入

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

输出

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

样例输入
3 3
1 2 1
2 3 2
1 3 3
1 3

样例输出
103.07153164

提示

1<=n<=2000

最短路
我给出两种写法,dijstra跑的比较慢,SPFA快了将近一倍。
给出代码

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=2505;
int n,m,st,end;
double map[2001][2001];
double d[maxn]={0};
double ans;
bool vis[maxn]={false};
void dijstra(int s)
{for(int i=1;i<=n;i++){d[i]=map[s][i];}d[s]=1;vis[s]=true;for(int i=1;i<=n;i++){int u=-1;double max=0;for(int j=1;j<=n;j++){if(vis[j]==false&&d[j]>max){max=d[j];u=j;}}if(u==-1) return;vis[u]=true;for(int j=1;j<=n;j++){if(!vis[j]&&d[j]<d[u]*map[u][j]){d[j]=d[u]*map[u][j];}}}
}
int main()
{scanf("%d",&n,&m);for(int i=1;i<=n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);map[a][b]=map[b][a]=double(100-c)/100;}scanf("%d%d",&st,&end);dijstra(st);ans=100/d[end];printf("%.8f %f",ans,d[end]);
}//用的矩阵存图,算法是djistra; 下面是SPFA的写法
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
int n,m,a,b;
double dis[2010];
double g[2001][2001];
queue<int> q;
int readint()
{char ch;int flag=1,num;while((ch=getchar())<'0'||ch>'9') if(ch=='-') break;if(ch=='-') flag=-1;else num=ch-'0';while((ch=getchar())>='0'&&ch<='9') num=num*10+ch-'0';return flag*num;
}struct node{int ab;int next;double hl;node (){next=-1;}
}arc[400000];
int first[20005],cur=0;
void add(const int&a,const int&b,const int&c)
{arc[++cur].ab=b;arc[cur].next=first[a];arc[cur].hl=double (100-c)/100;first[a]=cur;
}
void in()
{memset(dis,0,sizeof(dis));n=readint();m=readint();int x,y,z;  for(int i=1;i<=m;i++){x=readint();y=readint();z=readint();add(x,y,z);add(y,x,z);}a=readint();b=readint();
}
void SPFA(int x)
{bool flag[2010]={0};dis[x]=1;flag[x]=true;q.push(x);while(!q.empty()){int u=q.front();q.pop();flag[u]=false;m=first[u];while(m!=-1){int v=arc[m].ab;if(dis[v]<dis[u]*arc[m].hl){dis[v]=dis[u]*arc[m].hl;if(!flag[v]){q.push(v);flag[v]=true;}}   m=arc[m].next;}}
}
int main()
{in();SPFA(a);printf("%0.8f",100/dis[b]);return 0;
}//SPFA的写法,加了读入优化和静态链表的存图方式,速度是香港记者。

SPFA 跑得快,跑得快。最小花费问题相关推荐

  1. 1230: 最小花费(spfa)

    1230: 最小花费 时间限制: 1 Sec 内存限制: 128 MB 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除 ...

  2. 【例4-4】最小花费

    [例4-4]最小花费 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1344 时间限制: 1000 ms         内存限制: 65536 ...

  3. 信息学奥赛一本通 1344:【例4-4】最小花费 | 洛谷 P1576 最小花费

    [题目链接] ybt 1344:[例4-4]最小花费 洛谷 P1576 最小花费 [题目考点] 1. 图论 单源最短路径 时间复杂度: Dijkstra算法: O(V2)O(V^2)O(V2) Dij ...

  4. OIBH杯第三次普及组模拟赛T2 最小花费

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

  5. hdu4122 制作月饼完成订单的最小花费

    题意:       有一个加工厂加工月饼的,这个工厂一共开业m小时,2000年1月1日0点是开业的第一个小时,每个小时加工月饼的价钱也不一样,然后每个月饼的保质期都是t天,因为要放在冰箱里保存,所以在 ...

  6. ZOJ3715 竞选班长求最小花费

    题意:       有n个小朋友竞选班长,一号想当班长,每个人都必须选择一个人当班长,并且不可以选择自己,并且每个人都有一个权值ai,这个权值就是如果1想让这个人改变主意选择自己当班长就得给他ai个糖 ...

  7. LeetCode-动态规划基础题-746. 使用最小花费爬楼梯

    描述 746.使用最小花费爬楼梯 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始). 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应 ...

  8. LeetCode Algorithm 746. 使用最小花费爬楼梯

    746. 使用最小花费爬楼梯 Ideas 首先确定题目类型,爬楼梯问题,并且给定了状态转移的限制,其实就已经可以确定状态转移方程了. 然后题目说可以从下标为0或下标为1的台阶开始爬,所以我们可以定义两 ...

  9. 算法题目——使用最小花费爬楼梯(动态规划)

    题目链接:746.使用最小花费爬楼梯 方法:动态规划 假设数组cost的长度为n,则n个阶梯分别对应下标0到n- 1,楼层顶部对应下标n,问题等价于计算达到下标n的最小花费.可以通过动态规划求解. 创 ...

最新文章

  1. JAVA9模块化详解(一)——模块化的定义
  2. 软件外包故事 - 加入团队战斗
  3. ElementUI中el-table双击单元格事件并获取指定列的值和弹窗显示详细信息
  4. QT的QLabel类的使用
  5. Sass mixin与extends、%placeholder、function
  6. java 判断object类型_Java 类继承机制
  7. linux 查看java cpu_Linux查看CPU和内存使用情况
  8. Java面向对象基础接口和抽象的理解
  9. oracle修改成olap模式,的Oracle OLAP Java实现 - 正确源加入
  10. linux中自动化日志分析,Shell项目案例7-应用日志分析
  11. python的三种取整方式_python3.6 numpy 数组的多种取整方式
  12. 2019第七届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)
  13. 英语学术论文写作概述
  14. 【目标提取】计算机视觉中如何利用颜色和形状提取目标?
  15. 计算机软件树状图,树状图怎么画|画树状图步骤
  16. Mac终端输出重定向到剪切板
  17. 致敬钢铁侠!!!!!
  18. 【前端】手把手教你实现类似某bao的放大镜功能
  19. 探讨魔兽dota改建原理
  20. 一个10年C++程序员对技术和业务的感悟,献给还在迷茫中的你

热门文章

  1. opencv自动裁切_荐Python Opencv 之 简单的视频裁剪功能的实现
  2. 离散题目13(判断自反关系)
  3. wps怎么把字缩到最小_wps怎么把最左侧的字体变小
  4. 突发!继22岁拼多多女员工猝死后,又一悲剧:拼多多员工家中跳楼自杀!公司紧急通告!...
  5. 【ROS学习】- tf学习 - tf中重要函数解析 (陆续更新....)
  6. sheng的学习笔记-ConcurrentHashMap(JDK1.7和16)源码分析
  7. unity UGUI显示数字上标
  8. HTML5 postMessage 和 onmessage API 详细应用
  9. 用小米平板,如何看小度路由器所连接的移动硬盘上的视频
  10. [转]一往无前 | 小米十周年,雷军公开演讲全文