POJ 1860 bellman-ford 的变形

/*题意:已知有n种货币,编号为1~n,以及它们之间的瑞换比例。现在
Nick有第fir种货币meney元,问你Nick能不能通过这些货币的瑞换规则,
使自己拿到更多的fir货币。
思路: bellman-ford 的变形 ,,只需将其改为求最长路,
判断图中是否有正环存在,在执行松弛操作时如果某一次没有发生松弛操作,
则只需判断d[s]与原始钱的数目的大小关系即可;
如果成功的松弛完毕,则说明图中存在着正环,就可以使货币增值. 

**/
#include<string>
#include<cstdlib>
#include<algorithm>
#include <stdio.h>
#include <iostream>
using namespace std;
struct{
   int start,end;
   double r,c;        
}edge[205];//当写成102大小时,会产生Runtime Error错误 102个顶点会产生204条边

int n,m,fir,el;//el 为边的数量 
double money;

bool bellman_ford(){
     double r,v,d[102];
     int f,i,j;
     memset(d,0,sizeof(d));//初始化
     d[fir]=money;
     while(d[fir]<=money){
        f=0;
        for(j=0;j<el;j++){//进行松弛
            double temp=(d[edge[j].start]-edge[j].c)*edge[j].r;
            if(d[edge[j].end]<temp)   //变形,取较大值                
              { 
                 d[edge[j].end]=temp;
                 f=1;
              }             
        }   
        if(!f)
          return 0;                                          
     }
     return 1;
     
}
int main(){
    scanf("%d%d%d%lf",&n,&m,&fir,&money);
    int i,j,u,v;
    double ruv,cuv,rvu,cvu;
    el=0;
    for(i=0;i<m;i++){
       scanf("%d%d%lf%lf%lf%lf",&u,&v,&ruv,&cuv,&rvu,&cvu);
       edge[el].start=u;
       edge[el].end=v;
       edge[el].r=ruv;
       edge[el++].c=cuv;
       edge[el].start=v;
       edge[el].end=u;
       edge[el].r=rvu;
       edge[el++].c=cvu;
    }
   // cout<<bellman_ford()<<endl;
    if(bellman_ford())
        printf("YES\n");
    else
         printf("NO\n");
    system("PAUSE");
    return 0;
}

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/chen_zhipeng/article/details/7610900
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞