博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1860 Currency Exchange(SPFA 判断有无“正”环)
阅读量:5024 次
发布时间:2019-06-12

本文共 1555 字,大约阅读时间需要 5 分钟。

题目链接:

【题目大意】

货币转换问题,给你初始金额还有货币种类。然后给你货币之间的汇率及手续费(转换时额外的花销)。问能否通过货币间的转换实现自己的本金增大。

将dis 数组初始化为0

用 SPFA不断 的进行松弛操作, 发现当前金额可以比本身大, 就更新,同时记录更新次数。如果更新次数超过n次,说明存在”正“环。

这里先说明下负环。(求最短距离的时候)

在我们用SPFA求最短路径的时候,如果存在负环,在松弛操作的时候总会加入队列 因为最小距离会越来越小,同样这里如果经过一次次的转换,如果可以使本金增大,那么松弛操作也会无限进行下去,我们以n为界限,超过n就说明存在正环,也就说明可以使本金增大。

【源代码】

#include 
#include
#include
#include
using namespace std;const int V = 3000;const int E = 1500;const double INF = 10000000.0;struct node{ int v,next; double R,C;}pnt[E];int head[V];double dis[V]; // no ideabool vis[V];int cnt[V];int e = 0;int N,M;int src;double val;void addedge(int u,int v,double R, double C){ pnt[e].v = v; pnt[e].R = R; pnt[e].C = C; pnt[e].next = head[u]; head[u] = e++;}void init(){ e=0; memset(head, -1,sizeof(head)); memset(vis, 0 ,sizeof(vis)); memset(cnt, 0 ,sizeof(cnt)); for(int i=0; i<=N; i++) dis[i] = 0;}int SPFA(){ queue
Q; Q.push(src) ; vis[src] = 1;dis[src] = val; ++cnt[src]; while(!Q.empty()){ int u = Q.front(); Q.pop(); vis[u] = 0; for(int i=head[u] ; i!=-1 ; i=pnt[i].next){ int v = pnt[i].v; double tmp = (dis[u]-pnt[i].C)*pnt[i].R; //当前位置可能变成的值 //本金 减去利息 再乘汇率; if(dis[v]
N) return -1; //negative cycle //如果一个点能变大N次以上 。 说明他还能继续增大,说明原值已经可以通过转换增大 } } } return 1;} int main(){ scanf("%d%d",&N,&M); scanf("%d",&src); scanf("%lf",&val); init(); int a,b; double Rab,Rba,Cab,Cba; for(int i=0;i

转载于:https://www.cnblogs.com/chaiwenjun000/p/5321163.html

你可能感兴趣的文章
二叉树的遍历问题总结
查看>>
3.14-3.20周总结
查看>>
Spring之面向切面编程AOP
查看>>
MATLAB GUI程序设计中使文本框接收多行输入的方法
查看>>
全文检索-Elasticsearch (四) elasticsearch.net 客户端
查看>>
Oracle DBMS_SESSION
查看>>
sublime复制当前行到下一行
查看>>
WPF 3D变换应用
查看>>
luogu4012 深海机器人问题 网络流
查看>>
android 拍照上传照片
查看>>
ArchLinux安装开源VMware Tools
查看>>
系统用户分析模型
查看>>
DB2 锁升级示例1
查看>>
16.RDD实战
查看>>
MainFrame知识小结(20120210)—dfsort/syncsort中的数据类型
查看>>
jsp题库 (一)小测(25/21)
查看>>
D - Flip tile
查看>>
Java连接RabbitMQ之创建连接
查看>>
开户vim编程之--cscope支持
查看>>
python数据类型图解
查看>>