/*题意:已知有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;
}
POJ 1860 bellman-ford 的变形
原文作者:Bellman - ford算法
原文地址: https://blog.csdn.net/chen_zhipeng/article/details/7610900
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/chen_zhipeng/article/details/7610900
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。