HDU 1217 Arbitrage(folyd算法)
来源:互联网 发布:淘宝上怎么注册网店 编辑:程序博客网 时间:2024/05/21 12:41
题意:给几个国家,然后给这些国家之间的汇率。判断能否通过这些汇率差进行套利交易。
Floyd的算法可以求出任意两点间的最短路径,最后比较本国与本国的汇率差,如果大于1,则可以。否则不可以。
最短路径,Floyd的算法原理:
Floyd-Warshall算法的原理是动态规划。
设D(i,j,k)为从i到j的只以集合中的k节点为中间节点的最短路径的长度。
若最短路径经过点k,则;D(i,j,k)=D(i,k)+D(k,j)
若最短路径不经过点k,则D(i,j,k)=D(i,j,k-1)。
因此,D(i,j,k)=min{D(i,k)+D(k,j),D(i,j,k-1)}。
在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。
算法描述:
for k ← 1 to n dofor i ← 1 to n do
for j ← 1 to n do
if (D(i,k)+D(k,j)<D(i,j)) then
D(i,j)← D(i,k)+D(k,j);
首先字符串映射成整形数不是问题,我们可以用map轻松解决。
然后跑一遍类似于fylod算法的程序。最后检查是否有Map[i][i]>1即可。
AC代码如下
#include<iostream>#include<map>using namespace std;const int maxn=105,inf=1<<29;int n,m;double Map[maxn][maxn];void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(Map[i][j]<Map[i][k]*Map[k][j]) Map[i][j]=Map[i][k]*Map[k][j];}int main(){ string s; int Case=1; while(cin>>n,n) { fill(&Map[0][0],&Map[maxn][0],0); map<string,int>mp; for(int i=1;i<=n;i++) { cin>>s; mp[s]=i; } cin>>m; for(int i=1;i<=m;i++) { string a,b; double w; cin>>a>>w>>b; Map[mp[a]][mp[b]]=w; } floyd(); double Max=0; for(int i=1;i<=n;i++) Max=max(Map[i][i],Max); cout<<"Case "<<Case++<<": "; if(Max>1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0;}
0 0
- HDU 1217 Arbitrage(folyd算法)
- hdu 1217 Arbitrage (spfa算法)
- hdu 1217 Arbitrage (Floyd算法)
- hdu 1217 Arbitrage (Floyd算法)
- POJ 2240:Arbitrage:folyd最短路算法变形求有向图的盈利环存在
- HDU 1217 Arbitrage
- hdu 1217 Arbitrage--Floyd
- Hdu-1217 Arbitrage
- HDU 1217 Arbitrage
- hdu 1217 Arbitrage
- hdu 1217 Arbitrage
- HDU 1217 Arbitrage
- hdu 1217 Arbitrage
- HDU 1217 Arbitrage
- HDU 1217 Arbitrage
- hdu 1217 Arbitrage
- HDU 1217 Arbitrage
- hdu 1217 Arbitrage
- 递推 ACdream1420 High Speed Trains
- Python数据库ORM SQLAlchemy 0.7学习笔记(1) 概要
- fibonacci数列
- secondary index
- 关于EJB最大白话的解释
- HDU 1217 Arbitrage(folyd算法)
- [前端] iframe及postMessage使用解析
- VR SDK分析
- 特别记事本这款文字编辑器怎么样
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- 转---背包九讲
- YunGalaxy办公流程管理平台
- Dijkstra
- 黑马程序员--应用:类的创建练习