pku 1860 Currency Exchange(Bellman-Ford )

还是币种交换问题,只是这里换汇的时候需要支付手续费。转化为最短路径问题,因为有负权路径,用Bellman-Ford 算法。当路径存在负环时就可以无限制刷钱,所以最终肯定是赚的。


//descrption below is added on August 31,2011

We can earn money as long as the negative-circle exists and it connects to source node. Since we just consider node with value larger than 0 when we look for shortest path, all the negative-circle we detect at the end would be connected to the source node.

Eventhough there is no negative-circle sometimes, we still can earn money. Just need to check the final value of node source.


#include <queue> #include <iostream> using namespace std; struct node { int start,end; double rate,commission; }; node edge[100*2+5]; double value[100]; int N,M,S; double V; int solve(int n); int main() { scanf("%d%d%d%lf",&N,&M,&S,&V); for(int i=0;i<M;i++) { int first,second; double rate1,commission1,rate2,commission2; scanf("%d%d%lf%lf%lf%lf",&first,&second,&rate1,&commission1,&rate2,&commission2); edge[i*2].start=edge[i*2+1].end=first; edge[i*2].end=edge[i*2+1].start=second; edge[i*2].rate=rate1; edge[i*2].commission=commission1; edge[i*2+1].rate=rate2; edge[i*2+1].commission=commission2; } if(solve(S)) printf("YES/n"); else printf("NO/n"); return 0; } int solve(int n) { memset(value,0,sizeof(value)); value[n]=V; for(int i=0;i<N;i++) { for(int j=0;j<2*M;j++) { if(value[edge[j].start]>0) { if((value[edge[j].start]-edge[j].commission)*edge[j].rate>value[edge[j].end]) value[edge[j].end]=(value[edge[j].start]-edge[j].commission)*edge[j].rate; } } } for(int j=0;j<2*M;j++) { if((value[edge[j].start]-edge[j].commission)*edge[j].rate>value[edge[j].end]) return true; } if(value[n]>V) return true; else return false; }

你可能感兴趣的:(算法,ini,Path,Exchange)