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

[2016-04-13][POJ][1860][Currency Exchange]

时间:2016-04-14 01:07:06      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-04-13 23:48:46 星期三

  • 题目编号:[2016-04-13][POJ][1860][Currency Exchange]

  • 题目大意:货币对换,问最后能否通过对换的方式使钱变多,

  • 分析:

    • 直接spfa判断是否存在环,如果存在那么就能无限增值
    • 如果不存在正环,那么直接判断最终d[s] 是否 大于初始值
  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. const int maxn = 100 + 10;
  7. struct Edge{
  8. int v;double c, r;
  9. Edge(int _v = 0,double _c = 0,double _r = 0):v(_v),c(_c),r(_r){}
  10. };
  11. vector<Edge> e[maxn];
  12. void ini(int n ){
  13. for(int i = 0 ; i <= n ; ++i){
  14. e[i].clear();
  15. }
  16. }
  17. void addedge(int u,int v,double c,double r){
  18. e[u].push_back(Edge(v,c,r));
  19. }
  20. int cnt[maxn];double d[maxn];
  21. bool spfa(int s,int n,double v){
  22. for(int i = 0 ; i <= n ; ++i) d[i] = 0;
  23. d[s] = v;
  24. queue<int> q;q.push(s);
  25. memset(cnt, 0 , sizeof(cnt));
  26. cnt[s] = 1;
  27. while(!q.empty()){
  28. int u = q.front();
  29. q.pop();
  30. for(int i = 0 ; i < e[u].size();++i){
  31. int v = e[u][i].v;
  32. if(d[v] < (d[u] - e[u][i].c) * e[u][i].r){
  33. d[v] = (d[u] - e[u][i].c) * e[u][i].r;
  34. q.push(v);
  35. if(++cnt[v] > n) return true;
  36. }
  37. }
  38. }
  39. return d[s] > v;
  40. }
  41. int main(){
  42. int n,m,s;
  43. double v;
  44. scanf("%d%d%d%lf",&n,&m,&s,&v);
  45. for(int i = 0 ; i < m ; ++i){
  46. int a,b;double Rab,Cab,Rba,Cba;
  47. scanf("%d%d%lf%lf%lf%lf",&a,&b,&Rab,&Cab,&Rba,&Cba);
  48. addedge(a,b,Cab,Rab);
  49. addedge(b,a,Cba,Rba);
  50. }
  51. puts(spfa(s,n,v)?"YES":"NO");
  52. return 0;
  53. }




[2016-04-13][POJ][1860][Currency Exchange]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/9fa0b946a67f5facac71856b8dc3d973.html

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