POJ - 1860 Currency Exchange(SPFA或Floyd)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 1860 Currency Exchange(SPFA或Floyd)相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=1860
题意:货币之间转换问题,有N种钱,M种转换,初始第S种钱有V价值,然后转换(转换公式:(钱价值-税)*汇率),问是否能有一种转换可以是初始S的钱价值增加。
题解:
1.SPFA
因为可能钱会减少,就是可能出现负边,所以肯定不能用dijkstra。
SPFA的话就是把每种情况都搜寻一下,判断初始的钱是否增加。
2.Floyd
看到网上有人用Floyd做,用两次Floyd,找正环,就是第一次相当于赋予一个初始值,然后第二次,如果还能再增加的话,相当于形成了一个正环。
循环一圈,肯定能增加初始的钱。(很巧妙的方法,OrzOrz。。。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 using namespace std; 6 7 double map[111],G1[111][111],G2[111][111],d[111]; 8 int n,m,s; 9 10 int Floyd(){ 11 for(int i=1;i<=n;i++) d[i]=map[i]; 12 for(int k=1;k<=n;k++) 13 for(int i=1;i<=n;i++) 14 for(int j=1;j<=n;j++) 15 if((map[i]-G2[i][j])*G1[i][j]>map[j]) 16 map[j]=(map[i]-G2[i][j])*G1[i][j]; 17 for(int i=1;i<=n;i++) if(d[i]<map[i]) return 1; 18 return 0; 19 } 20 21 int main(){ 22 memset(map,0,sizeof(map)); 23 memset(G1,0,sizeof(G1)); 24 memset(G2,0,sizeof(G2)); 25 double v; 26 cin>>n>>m>>s>>v; 27 for(int i=1;i<=m;i++){ 28 int a,b; 29 double c,d,e,f; 30 cin>>a>>b>>c>>d>>e>>f; 31 G1[a][b]=c;G2[a][b]=d; 32 G1[b][a]=e;G2[b][a]=f; 33 } 34 map[s]=v; 35 Floyd(); 36 if(Floyd()) cout<<"YES"<<endl; 37 else cout<<"NO"<<endl; 38 return 0; 39 }
以上是关于POJ - 1860 Currency Exchange(SPFA或Floyd)的主要内容,如果未能解决你的问题,请参考以下文章
POJ-1860 Currency Exchange spfa判负环
POJ 1860 Currency Exchange (最短路)