【SPFA】POJ1860-Currency Exchange
【题目大意】
给出每两种货币之间交换的手续费和汇率,求出从当前货币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的更多相关文章
- 【POJ】1860 Currency Exchange
真是气skr人..没把d[]换成double...de了一上午的bug// 记得用G++提交啊 题目链接:http://poj.org/problem?id=1860 题意:告诉你n个点,m条路.起始 ...
- POJ1860 Currency Exchange【最短路-判断环】
Several currency exchange points are working in our city. Let us suppose that each point specializes ...
- poj1860 Currency Exchange(spfa判断正环)
Description Several currency exchange points are working in our city. Let us suppose that each point ...
- POJ1860 Currency Exchange —— spfa求正环
题目链接:http://poj.org/problem?id=1860 Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Tota ...
- 【SPFA】 最短路计数
最短路计数 [问题描述] 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式] 输入第一行包含2个正整数N,M,为图的顶点数与边数. ...
- POJ1860——Currency Exchange(BellmanFord算法求最短路)
Currency Exchange DescriptionSeveral currency exchange points are working in our city. Let us suppos ...
- sendrose【SPFA】
之前看到一题需要并查集+SPFA,然后就特别囧的发现自己SPFA这个历史遗留问题已经不知道怎么打了╮(╯▽╰)╭ 就果断挑了一题特别裸的SPFA赶紧搞搞掉,顺便自己乱YY下学SPFA的笔记,免得自己下 ...
- 【SPFA】POJ1511-Invitation Cards
[题目大意] 给出一张有向图,以1位源点,求“从源点出发到各点的距离”和“与各点返回源点的距离和”相加得到的和. [思路] 毫无疑问是最短路径,但是这数据量就算是SPFA也绝壁会超时啊,抱着必死的心态 ...
- POJ1860 Currency Exchange(bellman-ford)
链接:http://poj.org/problem?id=1860 Currency Exchange Description Several currency exchange points are ...
随机推荐
- Ubuntu自定义终端窗口位置
方法一: 自定义终端启动快捷键 具体方法是自定义一个快速启动终端的快捷键,附带设置终端启动时的位置参数.首先获得需要放置窗口的目标位置信息,可以通过终端命令“ xwininfo ”来获得.步骤是首先打 ...
- [转] A*寻路算法C++简单实现
参考文章: http://www.policyalmanac.org/games/aStarTutorial.htm 这是英文原文<A*入门>,最经典的讲解,有demo演示 http: ...
- Maven仓库国内镜像站
感谢阿里巴巴,搭建并公开了Maven仓库的国内镜像站.话外:使用Maven的官方仓库真的是太slow了! 在<Maven Root>/conf/settings.xml中的<mirr ...
- Ubuntu下安装arm-linux-gnueabi-xxx编译器【转】
转自:http://blog.csdn.net/real_myth/article/details/51481639 from: http://www.linuxdiyf.com/linux/1948 ...
- [转]关于MyEclipse下的项目无法使用BASE64Encoder问题的解决办法
[链接] http://blog.csdn.net/longlonglongchaoshen/article/details/75087616
- 分析new delete 的本质
在程序设计中,数据可能会存在不同的内存空间,如函数栈 堆 全局变量区 ,今天我们来分析一下C++中堆分配方式和C语言的堆分配方式异同,从而更好的理解new delete本质 C语言使用mall ...
- cuowu
ngFor不能用于Object rowspan colspan不能绑定变量,要用attr.colspan https://stackoverflow.com/questions/35615751/wh ...
- centos7.2下caffe的安装及编译
1.前期准备 安装依赖 sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5 ...
- Codeforces 777E - Hanoi Factory(贪心+栈)
题目链接:http://codeforces.com/problemset/problem/777/E 题意:有n个环给你内环半径.外环半径和高度,叠这些环还要满足以下要求: ①:下面的环的外径要&g ...
- 编译原理之正则表达式转NFA
本文转载自http://chriszz.sinaapp.com/?p=257 输入一个正则表达式,输出一个NFA. 我的做法:输入一个字符串表示正则,输出则是把输出到一个.dot文件中并将dot文件编 ...