链接: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 "); else printf("NO "); return 0; }