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——T1860 Currency Exchange

POJ 1860 Currency Exchange

POJ 1860 Currency Exchange (最短路)

poj1860 Currency Exchange(spfa判断正环)

POJ1860 Currency Exchange