传送门:poj1860。
题意:有多种货币和多个货币兑换处,每个货币兑换处能将确定的两种货币互相兑换,但要收取一定的手续费,给你一种初始货币和一定的数量问你能不能经过兑换后使其数量变多。最后要换回初始的货币种类。
货币兑换公式:Vb=(Va-Cab)*Rab.
将每种货币看为一个点,一种货币能兑换兑换成另一种就在这两个点之间加一条边,即每个货币兑换处能在两个点之间形成一个环,要使货币增值就是看整个图中有没有正权回路,即Bellman-ford算法的逆运用,将初始货币代表的点到其他点的距离初始化为0,到自己的距离为初始货币数量,有正权回路即能无限松弛。将Bellman-ford算法中判断负权回路的条件和松弛的条件改为小于即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
int p,q;
double r,c;
}ex[202];
int n,m,s;
double v;
double dis[101];
int rebellman_ford()
{
memset(dis,0,sizeof(dis));
di