【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 ...
随机推荐
- layui-laypage模块代码详解
/** layui-v2.4.0 MIT License By https://www.layui.com */;layui.define(function(e) { "use strict ...
- Linux输入子系统:多点触控协议 -- multi-touch-protocol.txt【转】
转自:http://blog.csdn.net/droidphone/article/details/8434768 Multi-touch (MT) Protocol --------------- ...
- 【驱动】USB驱动实例·串口驱动·键盘驱动【转】
转自:http://www.cnblogs.com/lcw/p/3159370.html Preface USB体系支持多种类型的设备. 在 Linux内核,所有的USB设备都使用 usb_drive ...
- 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' ...
- 读书笔记 effective c++ Item 52 如果你实现了placement new,你也要实现placement delete
1. 调用普通版本的operator new抛出异常会发生什么? Placement new和placement delete不是C++动物园中最常遇到的猛兽,所以你不用担心你对它们不熟悉.当你像下面 ...
- C++ : Boost : Rational 有理数类
因为一些不为人知的原因, 我需要一些能减少我程序误差的东西.于是找到了这个类. 然后下载了Boost这个庞大的库. 安装与配置 在官网上找到下载地址, 大概有71MB, 下来来解压到任意位置就好了. ...
- (转载)使用SQL-Server创建一个银行数据管理系统Ⅰ
首先,要创建一个完整的数据管理系统,不是一蹴而就的,一定要要一步一步的来,不断完善,最终方能达到自己想要的结果,所以我在这里也是一点一点分步来做的. 创建数据库,数据库属性在这里用的是默认(不推荐使用 ...
- 拉格朗日(Lagrange)插值算法
拉格朗日插值(Lagrange interpolation)是一种多项式插值方法,指插值条件中不出现被插函数导数值,过n+1个样点,满足如下图的插值条件的多项式.也叫做拉格朗日公式. 这里以拉格朗日 ...
- 在jenkins里使用SCM管理jenkinsfile
注意,这样作的前提是,插件里一定要安装pipeline和git. 设置就比较简单了. 在gitlat里生成一个演示的jenkinsfile pipeline { agent { node { labe ...
- CCF CSP 201512-2 消除类游戏
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...