【题目大意】

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

【思路】

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

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct Rec
{
int ori,des;
double len,val;
};
const int MAXN=+;
int first[MAXN],next[MAXN*];
/*用于存储邻接表*/
double dis[MAXN];
/*存储从s出发到达当前货币的最大值*/
int vis[MAXN];
/*判断某一个点是否已经存在于队列中*/
Rec edge[MAXN*];
int n,m,s;
double v; bool SPFA()
{
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
queue<int> que; dis[s]=v;
/*默认到持有货币的距离为持有货币的价值*/
vis[s]=;
que.push(s); while (!que.empty())
{
int pos=que.front();
int k=first[pos];
vis[pos]=;
que.pop();
while (k!=-)
{
if (dis[edge[k].des]<(dis[pos]-edge[k].len)*edge[k].val)
{
dis[edge[k].des]=(dis[pos]-edge[k].len)*edge[k].val;
if (!vis[edge[k].des])
{
vis[edge[k].des]=;
que.push(edge[k].des);
}
}
k=next[k];
}
if (dis[s]>v) return true;
}
return false;
} int main()
{
scanf("%d%d%d%lf",&n,&m,&s,&v);
s--;
memset(first,-,sizeof(first)); for (int i=;i<m;i++)
{
int a,b;
double c1,r1,c2,r2;
scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2);
a--;
b--;
edge[i*].ori=edge[i*+].des=a;
edge[i*].des=edge[i*+].ori=b;
edge[i*].val=r1;
edge[i*].len=c1;
edge[i*+].val=r2;
edge[i*+].len=c2; next[i*]=first[a];
first[a]=i*;
next[i*+]=first[b];
first[b]=i*+;
}
m=m*+;
if (SPFA()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
//system("pause");
return ;
}

【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. 容斥原理&&莫比乌斯专题

    A题:A - Eddy's爱好   HDU - 2204 具体思路:如果是求n中,为平方数的有多少个,那么答案肯定是sqrt(n),同理,如果是三次根号的话,那么答案肯定是n的三分之一次方.然后继续按 ...

  2. win10+anaconda虚拟环境python3.6+cuda9.0+cudnn7+pytorch0.4.1

    anaconda下jupyter notebook的打开目录的修改:参考:https://www.cnblogs.com/amberdata/p/7907845.html pytorch官网:http ...

  3. [转]Laplace算子和Laplacian矩阵

    1 Laplace算子的物理意义 Laplace算子的定义为梯度的散度. 在Cartesian坐标系下也可表示为: 或者,它是Hessian矩阵的迹: 以热传导方程为例,因为热流与温度的梯度成正比,那 ...

  4. weblogica domain目录 环境变量 如何启动weblogic server

    手工启动weblogic server

  5. KVM,QEMU,libvirt入门学习笔记【转】

    转自:http://blog.csdn.net/julykobe/article/details/27571387 注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明. 0.虚拟 ...

  6. 移动端测试=== adb 无线连接手机

    无线连接(需要借助 USB 线) 除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 ...

  7. Linux内核跟踪之ring buffer的实现【转】

      转自:http://blog.chinaunix.net/uid-20543183-id-1930845.html ---------------------------------------- ...

  8. 【hihocoder1251】Today is a rainy day

    #include<bits/stdc++.h> ; ; const int inf=0x3f3f3f3f; using namespace std; char s1[N],s2[N]; ] ...

  9. BZOJ 3510 - 首都 「 $LCT$ 动态维护树的重心」

    这题 FlashHu 的优化思路值得借鉴 前置引理 树中所有点到某个点的距离和中,到重心的距离和是最小的. 把两棵树通过某一点相连得到一颗新的树,新的树的重心必然在连接原来两棵树重心的路径上. 一棵树 ...

  10. python基础--面向对象

    什么是面向对象编程 OOP编程是利用“类”和对象来创建各种模型来实现对真实世界的描述. OOP具有可维护性和可扩展性 二:面向对象有那些特性 1)CLASS类:一个类是对拥有相同属性的对象的抽象.类拥 ...