链接:https://vjudge.net/problem/POJ-1860
题意:
有N个点,支持货币兑换,从货币a->b手续费c,汇率r。
求能否换一圈使总净额增加。
思路:
bellman-ford。
找一个正权回路。
代码:
#include <iostream>
#include <memory.h>
using namespace std;
const int MAXN = 210;
double dis[MAXN];
int n,m,s;
double v;
int w = 1;
struct Node
{int a,b;double r,c;
}node[210];bool bellman_Ford()
{memset(dis,0, sizeof(dis));dis[s] = v;for (int i = 1;i <= n-1;i++){bool flag = false;for (int j = 1;j<w;j++){int a = node[j].a,b = node[j].b;double r = node[j].r,c = node[j].c;if (dis[b] < (dis[a]-c)*r){dis[b] = (dis[a]-c)*r;flag = true;}}if (!flag)break;}for (int i = 1;i < w;i++)if (dis[node[i].b] < (dis[node[i].a] - node[i].c)*node[i].r)return true;return false;
}int main()
{int a,b;double rab,cab,rba,cba;scanf("%d%d%d%lf",&n,&m,&s,&v);for (int i = 0;i<m;i++){scanf("%d%d%lf%lf%lf%lf",&a,&b,&rab,&cab,&rba,&cba);node[w].a = a;node[w].b = b;node[w].r = rab;node[w++].c = cab;node[w].b = a;node[w].a = b;node[w].r = rba;node[w++].c = cba;}if (bellman_Ford())printf("YES\n");elseprintf("NO\n");return 0;
}