题意:有各种货币 然后可以通过一定方式转换成另外一种货币 规则是 (持有货币 - 转换所需要的手续费) * 利率 = 转换成的货币 第一行数据: 几种货币 货币汇率个数(例如 1 到2 2到 3) 现在持有第几种货币 货币的价值 剩下行 : 货币A 货币 B 货币A到货币B的汇率 AB的手续费 BA的汇率 BA的手续费 如果他的资产增值那么输出YES 反之为NO 思路: 用bellman算法求环 如果是正环那么他的资产肯定增值 判断是否存在正环就可以 具体见算法 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define maxn 300 using namespace std; int n,m,s; int coun; double v; struct Node { int a; int b; double rate; double commision; } node[maxn]; double d[maxn]; bool flag; bool bellman() { memset(d,0,sizeof(d)); d[s] = v; for(int i = 1; i <= n ; i ++) { flag = false; for(int j = 0; j < coun; j ++) { if(d[node[j].b] < (d[node[j].a] - node[j].commision) * node[j].rate) { d[node[j].b] = (d[node[j].a] - node[j].commision) * node[j].rate; flag = true; } } if( i == n) return flag; //if(!flag) //break; } /*for(int k = 0; k < coun; k ++) if(d[node[k].b] < (d[node[k].a] - node[k].commision) * node[k].rate) return true; return false;*/ } int main() { int a,b; double rab,cab,rba,cba; scanf("%d%d%d%lf",&n,&m,&s,&v); coun = 0; for(int i = 0; i < m; i ++) { scanf("%d%d%lf%lf%lf%lf",&a,&b,&rab,&cab,&rba,&cba); node[coun].a = a; node[coun].b = b; node[coun].rate = rab; node[coun++]. commision = cab; node[coun].a = b; node[coun].b = a; node[coun].rate = rba; node[coun++].commision = cba; } if(bellman()) printf("YES\n"); else printf("NO\n"); return 0; }