poj_1860 SPFA
题目大意
有N种货币,M个兑换点,每个兑换点只能相互兑换两种货币。设兑换点A可以兑换货币C1和C2,给出rate(C1--C2)表示1单位的C1货币可以兑换出的C2货币数目,rate(C2--C1)表示1单位的C2货币可以兑换出的C1货币数目,commision(C1)表示用C1兑换C2的时候兑换点需要收取的佣金,commison(C2)表示C2到C1兑换时候兑换点收取的佣金,那么进行C1-C2的兑换操作实际得到的结果为 (amount(C1)-commision(C1))*rate(C1-C2),同理C2-C1的兑换操作最终得到的C1为 (amount(C2)-commision(C2))*rate(C2-C1)。
先给定数目为V的货币S,问是否有一种兑换方法,使得经过兑换之后,S的数目增加。
题目分析
要求从货币S经过若干次兑换,最终回到S,使得S的数目增加。将N种货币视为N个点,将M个兑换点视为M条双向路径,则题目转换为是否存在一条回路使得从点S出发回到S,初始值增加。
可以求出从S到每种货币经过路径兑换之后所能得到的最大数值,类似求单源最短路径,题目的结果就是从S到S的最大数值是否大于初始值V。
采用SPFA算法求解。由于图中的任意一条边都是双向的,且其中的回路可以走任意多次(回路上的货币可能一直增加),则如果存在使得soruce货币增加的回路,回路上的点会被push进队列,则一定能够回到source节点;如果不存在使得source货币增加的路径,则肯定不存在一直循环增加的回路,那么队列肯定不会一直增长不会陷入死循环;判断source到source的环是否使得钱增加即可,若增加则直接返回true
实现(c++)
- #include<stdio.h>
- #include<algorithm>
- #include<vector>
- #include<queue>
- using namespace std;
- struct Edge{
- int vertex;
- double commision;
- double rate;
- };
- vector<vector<Edge> > gEdges;
- double gCurrency[105]; //将每种货币视为图上的一个节点,gCurrency用于存放每个节点的钱数
- bool Spfa(int source, int n, double init_value){
- queue<int> Q;
- Q.push(source);
- for (int i = 0; i <= n; i++){
- gCurrency[i] = 0;
- }
- gCurrency[source] = init_value; //SPFA算法
- while (!Q.empty()){
- int v = Q.front();
- Q.pop();
- for (int i = 0; i < gEdges[v].size(); i++){
- Edge& e = gEdges[v][i];
- double tmp = (gCurrency[v] - e.commision)*e.rate;
- if (gCurrency[e.vertex] < tmp){
- gCurrency[e.vertex] = tmp;
- Q.push(e.vertex);
- //由于图中的任意一条边都是双向的,且其中的回路可以走任意多次(回路上的货币可能一直增加),
- //则如果存在使得soruce货币增加的回路,回路上的点会被push进队列,则一定能够回到source节点。
- //如果不存在使得source货币增加的路径,则肯定不存在一直循环增加的回路,那么队列肯定不会一直增长
- //不会陷入死循环
- //判断source到source的环是否使得钱增加即可,若增加则直接返回true
- if (e.vertex == source && gCurrency[source] > init_value){
- return true;
- }
- }
- }
- }
- return false;
- }
- int main(){
- int n, m, s;
- double v;
- scanf("%d %d %d %lf", &n, &m, &s, &v);
- int currency1, currency2;
- double commision1, commision2, rate1, rate2;
- gEdges.resize(105);
- Edge e;
- //初始化图结构
- for (int i = 0; i < m; i++){
- scanf("%d %d %lf %lf %lf %lf", ¤cy1, ¤cy2, &rate1, &commision1, &rate2, &commision2);
- e.vertex = currency2;
- e.commision = commision1;
- e.rate = rate1;
- gEdges[currency1].push_back(e);
- e.vertex = currency1;
- e.commision = commision2;
- e.rate = rate2;
- gEdges[currency2].push_back(e);
- }
- if (Spfa(s, n, v)) //用SPFA判断,从source到source的路径中有没有使得钱数增加的
- printf("YES\n");
- else
- printf("NO\n");
- return 0;
- }
poj_1860 SPFA的更多相关文章
- 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa
3627: [JLOI2014]路径规划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 186 Solved: 70[Submit][Status] ...
- POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)
传送门 Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 46727 Acce ...
- sgu 240 Runaway (spfa)
题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...
- spfa模板
通过stl的queue实现的spfa(vector实现邻接表存图) 本模板没有考虑存在两点不连通的情况 如果需要判断则需要用到并查集或者遍历整个邻接表 #include<iostream> ...
- SPFA
SPFA算法用来求单源最短路.可以处理任何有解的情况. 先建一个数组\(dist_x = 起点到x的最短路长度\),当\(x=起点\)时为0,当x和起点不通时为INF(本题中为\(2^31-1\)). ...
- BZOJ2763 [JLOI2011]飞行路线(SPFA + DP)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=2763 Description Alice和Bob现在要乘飞机旅行,他们选择了一家 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- codevs 1021 玛丽卡(spfa)
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
随机推荐
- EM 算法 实例
#coding:utf-8 import math import copy import numpy as np import matplotlib.pyplot as plt isdebug = T ...
- nodejs 发起http请求
http://nodejs.cn/api/http.html#http_http_request_options_callback http://yijiebuyi.com/blog/8221eb14 ...
- elipse快捷键大全 elipse快捷键详解
1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...
- vue使用axios,进行网络请求
1.首先自己创建一个组件: https://www.cnblogs.com/fps2tao/p/9559291.html 2.安装:axios(可以npm安装,也可以下载js引入文件) npm ins ...
- Decoration5:引入Actuator进行站点监控
1.添加依赖 2.重启应用 3.下图显示了一些默认的监控端点 这是数据可以在前台用来做饼图和柱状图什么的,不过实际上我们现在还用不到,于是就不深入研究
- xcode下build release版本号的.a库
1. 点击房子 图标button watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcnlmZGl6dW8=/font/5a6L5L2T/fontsize/40 ...
- js 内存泄漏
在javascript中,我们很少去关注内存的管理.我们创建变量,使用变量,浏览器关注这些底层的细节都显得很正常. 但是当应用程序变得越来越复杂并且ajax化之后,或者用户在一个页面停留过久,我们可能 ...
- 卡特兰数 catalan number
作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...
- 正则 群组 Group
static void Main(string[] args) { string strUrl = "<a href=\"user.php?act=order_detail& ...
- mysql索引学习
索引用于快速找出在某列中有一特定值的行. 如果不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行. 表越大,查询数据所花费的时间越多. 如果表中查询的列有一个索引,MySQL能快速 ...