题目大意

有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", &currency1, &currency2, &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的更多相关文章

  1. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  2. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  3. sgu 240 Runaway (spfa)

    题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...

  4. spfa模板

    通过stl的queue实现的spfa(vector实现邻接表存图) 本模板没有考虑存在两点不连通的情况 如果需要判断则需要用到并查集或者遍历整个邻接表 #include<iostream> ...

  5. SPFA

    SPFA算法用来求单源最短路.可以处理任何有解的情况. 先建一个数组\(dist_x = 起点到x的最短路长度\),当\(x=起点\)时为0,当x和起点不通时为INF(本题中为\(2^31-1\)). ...

  6. BZOJ2763 [JLOI2011]飞行路线(SPFA + DP)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=2763 Description Alice和Bob现在要乘飞机旅行,他们选择了一家 ...

  7. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  8. bzoj 1179[Apio2009]Atm (tarjan+spfa)

    题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  9. codevs 1021 玛丽卡(spfa)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

随机推荐

  1. EMQTT benchmark测试

    #-c 最大的客户端数据, -i:时间间隔 -t:订阅主题 -q:订阅方式 ./emqtt_bench_sub -c 50000 -i 10 -t bench/%i -q 2 notice: You ...

  2. PHP自学,第一阶段,基础学习

    环境搭建OS X系统上 Win7执行OS X虚拟机 在 OS X上安装MAMP执行环境 IDE使用 Netbeans PHP版本号开发 数据库使用mysql 自学资料使用:PHP从入门到精通.pdf ...

  3. 基于CentOS的MySQL学习补充四--使用Shell批量从CSV文件里插入数据到数据表

    本文出处:http://blog.csdn.net/u012377333/article/details/47022699 从上面的几篇文章中,能够知道怎样使用Shell创建数据库.使用Shell创建 ...

  4. tbnet编译

    下载tbnet 下载地址:http://code.taobao.org/p/tb-common-utils/src/trunk/tbnet/ ,它的svn地址为:http://code.taobao. ...

  5. github提交一个空目录

    github默认不上传空目录,有的时候需要空目录来保持程序的结构. 二个小问题. 1.始终保持空目录,即时里面有文件,也全部忽略掉. 建立一个.gitignore文件放到空目录内. mkdir emp ...

  6. HDU 1863 畅通工程 克鲁斯卡尔算法

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. vue中config/index.js:配置的详细理解

    当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面  (环境变量及其基本变量的配置) var path = require('path') ...

  8. js 去html 标签

    var stylereg = /style\=".+?"/g //去style样式 var alltagreg = /<[^>]*>/g //去除全部标签 var ...

  9. hive表分区的修复

    hive从低版本升级到高版本或者做hadoop的集群数据迁移时,需要重新创建表和表分区,由于使用的是动态分区,所以需要重新刷新分区表字段,否则无法查看数据. 在hive中执行中以下命令即可自动更新元数 ...

  10. Linux下配置Hadoop伪分布式环境

    1. 准备Linux环境 提示:我用的系统是CentOS 6.4. 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host- ...