码迷,mamicode.com
首页 > 其他好文 > 详细

POJ - 1860 Currency Exchange(SPFA或Floyd)

时间:2017-08-15 10:06:39      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:lan   方法   problem   ios   get   double   ref   targe   span   

题目链接: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)

标签:lan   方法   problem   ios   get   double   ref   targe   span   

原文地址:http://www.cnblogs.com/Leonard-/p/7363178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!