【题目大意】

给出每两种货币之间交换的手续费和汇率,求出从当前货币s开始交换,能否赚。

【思路】

反向运用SPFA,判断是否有正环。每次队首元素出队之后,判断一下到源点s的距离是否增大,增大则返回true。一开始判断正环的思路如果有一个元素入队超过n次,则说明存在正环。后来发现这个思路是不适用的,因为这个正环中并不一定包含源点..要注意的是:题目中的m并不是边数,边数应该是m*2!所以开数组的时候要尤其注意数组不能开小了。由于C++的判定中如果没有崩掉,不会返回RE只会返回WA,我纠结了好久才找出错因。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. struct Rec
  7. {
  8. int ori,des;
  9. double len,val;
  10. };
  11. const int MAXN=+;
  12. int first[MAXN],next[MAXN*];
  13. /*用于存储邻接表*/
  14. double dis[MAXN];
  15. /*存储从s出发到达当前货币的最大值*/
  16. int vis[MAXN];
  17. /*判断某一个点是否已经存在于队列中*/
  18. Rec edge[MAXN*];
  19. int n,m,s;
  20. double v;
  21.  
  22. bool SPFA()
  23. {
  24. memset(dis,,sizeof(dis));
  25. memset(vis,,sizeof(vis));
  26. queue<int> que;
  27.  
  28. dis[s]=v;
  29. /*默认到持有货币的距离为持有货币的价值*/
  30. vis[s]=;
  31. que.push(s);
  32.  
  33. while (!que.empty())
  34. {
  35. int pos=que.front();
  36. int k=first[pos];
  37. vis[pos]=;
  38. que.pop();
  39. while (k!=-)
  40. {
  41. if (dis[edge[k].des]<(dis[pos]-edge[k].len)*edge[k].val)
  42. {
  43. dis[edge[k].des]=(dis[pos]-edge[k].len)*edge[k].val;
  44. if (!vis[edge[k].des])
  45. {
  46. vis[edge[k].des]=;
  47. que.push(edge[k].des);
  48. }
  49. }
  50. k=next[k];
  51. }
  52. if (dis[s]>v) return true;
  53. }
  54. return false;
  55. }
  56.  
  57. int main()
  58. {
  59. scanf("%d%d%d%lf",&n,&m,&s,&v);
  60. s--;
  61. memset(first,-,sizeof(first));
  62.  
  63. for (int i=;i<m;i++)
  64. {
  65. int a,b;
  66. double c1,r1,c2,r2;
  67. scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2);
  68. a--;
  69. b--;
  70. edge[i*].ori=edge[i*+].des=a;
  71. edge[i*].des=edge[i*+].ori=b;
  72. edge[i*].val=r1;
  73. edge[i*].len=c1;
  74. edge[i*+].val=r2;
  75. edge[i*+].len=c2;
  76.  
  77. next[i*]=first[a];
  78. first[a]=i*;
  79. next[i*+]=first[b];
  80. first[b]=i*+;
  81. }
  82. m=m*+;
  83. if (SPFA()) cout<<"YES"<<endl;
  84. else cout<<"NO"<<endl;
  85. //system("pause");
  86. return ;
  87. }

【SPFA】POJ1860-Currency Exchange的更多相关文章

  1. 【POJ】1860 Currency Exchange

    真是气skr人..没把d[]换成double...de了一上午的bug// 记得用G++提交啊 题目链接:http://poj.org/problem?id=1860 题意:告诉你n个点,m条路.起始 ...

  2. POJ1860 Currency Exchange【最短路-判断环】

    Several currency exchange points are working in our city. Let us suppose that each point specializes ...

  3. poj1860 Currency Exchange(spfa判断正环)

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

  4. POJ1860 Currency Exchange —— spfa求正环

    题目链接:http://poj.org/problem?id=1860 Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Tota ...

  5. 【SPFA】 最短路计数

    最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. ...

  6. POJ1860——Currency Exchange(BellmanFord算法求最短路)

    Currency Exchange DescriptionSeveral currency exchange points are working in our city. Let us suppos ...

  7. sendrose【SPFA】

    之前看到一题需要并查集+SPFA,然后就特别囧的发现自己SPFA这个历史遗留问题已经不知道怎么打了╮(╯▽╰)╭ 就果断挑了一题特别裸的SPFA赶紧搞搞掉,顺便自己乱YY下学SPFA的笔记,免得自己下 ...

  8. 【SPFA】POJ1511-Invitation Cards

    [题目大意] 给出一张有向图,以1位源点,求“从源点出发到各点的距离”和“与各点返回源点的距离和”相加得到的和. [思路] 毫无疑问是最短路径,但是这数据量就算是SPFA也绝壁会超时啊,抱着必死的心态 ...

  9. POJ1860 Currency Exchange(bellman-ford)

    链接:http://poj.org/problem?id=1860 Currency Exchange Description Several currency exchange points are ...

随机推荐

  1. layui-laypage模块代码详解

    /** layui-v2.4.0 MIT License By https://www.layui.com */;layui.define(function(e) { "use strict ...

  2. Linux输入子系统:多点触控协议 -- multi-touch-protocol.txt【转】

    转自:http://blog.csdn.net/droidphone/article/details/8434768 Multi-touch (MT) Protocol --------------- ...

  3. 【驱动】USB驱动实例·串口驱动·键盘驱动【转】

    转自:http://www.cnblogs.com/lcw/p/3159370.html Preface USB体系支持多种类型的设备. 在 Linux内核,所有的USB设备都使用 usb_drive ...

  4. Error: No resource found that matches the given name (at 'icon' with value '@mipmap/Icon')

    问题: error: Error: No resource found that matches the given name (at 'icon' with value '@mipmap/Icon' ...

  5. 读书笔记 effective c++ Item 52 如果你实现了placement new,你也要实现placement delete

    1. 调用普通版本的operator new抛出异常会发生什么? Placement new和placement delete不是C++动物园中最常遇到的猛兽,所以你不用担心你对它们不熟悉.当你像下面 ...

  6. C++ : Boost : Rational 有理数类

    因为一些不为人知的原因, 我需要一些能减少我程序误差的东西.于是找到了这个类. 然后下载了Boost这个庞大的库. 安装与配置 在官网上找到下载地址, 大概有71MB, 下来来解压到任意位置就好了. ...

  7. (转载)使用SQL-Server创建一个银行数据管理系统Ⅰ

    首先,要创建一个完整的数据管理系统,不是一蹴而就的,一定要要一步一步的来,不断完善,最终方能达到自己想要的结果,所以我在这里也是一点一点分步来做的. 创建数据库,数据库属性在这里用的是默认(不推荐使用 ...

  8. 拉格朗日(Lagrange)插值算法

    拉格朗日插值(Lagrange interpolation)是一种多项式插值方法,指插值条件中不出现被插函数导数值,过n+1个样点,满足如下图的插值条件的多项式.也叫做拉格朗日公式.  这里以拉格朗日 ...

  9. 在jenkins里使用SCM管理jenkinsfile

    注意,这样作的前提是,插件里一定要安装pipeline和git. 设置就比较简单了. 在gitlat里生成一个演示的jenkinsfile pipeline { agent { node { labe ...

  10. CCF CSP 201512-2 消除类游戏

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...