POJ1860
Posted Blogggggg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ1860相关的知识,希望对你有一定的参考价值。
题目链接:https://vjudge.net/problem/POJ-1860
解题思路:每种货币就是一个点,而兑换点其实就是边,由此组成图,求的是“最长路”。利用Bellman-Ford算法判断是否有正环。
AC代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 using namespace std; 5 const int maxn=105; 6 int vis[maxn]; 7 double d[maxn]; 8 int N,M,S,j; 9 double V; 10 struct edge{ 11 int from,to; 12 double rate,comm; 13 }es[maxn<<1]; 14 bool Bellman_Ford(){ 15 d[S]=V; 16 for(int i=1;i<N;i++){ 17 bool update=false; 18 for(int k=0;k<j;k++){ 19 edge temp=es[k]; 20 if(d[temp.to]<(d[temp.from]-temp.comm)*temp.rate){ 21 d[temp.to]=(d[temp.from]-temp.comm)*temp.rate; 22 update=true; 23 } 24 } 25 if(!update) 26 return false; //如果更新次数小于或等于N-1次,那么说明没有正环 27 } //如果没有正环,那么最多更新N-1次 28 for(int k=0;k<j;k++){ 29 edge temp=es[k]; 30 if(d[temp.to]<(d[temp.from]-temp.comm)*temp.rate){ 31 d[temp.to]=(d[temp.from]-temp.comm)*temp.rate; 32 return true; //如果能更新N次,那么说明有正环 33 } 34 } 35 return false; 36 } 37 int main(){ 38 scanf("%d%d%d%lf",&N,&M,&S,&V); 39 for(int i=1;i<=M;i++){ 40 scanf("%d%d",&es[j].from,&es[j].to); 41 scanf("%lf%lf",&es[j].rate,&es[j].comm); 42 j++; 43 scanf("%lf%lf",&es[j].rate,&es[j].comm); 44 es[j].from=es[j-1].to,es[j].to=es[j-1].from; 45 j++; 46 } 47 if(Bellman_Ford()) printf("YES\n"); 48 else printf("NO\n"); 49 return 0; 50 }
以上是关于POJ1860的主要内容,如果未能解决你的问题,请参考以下文章