Bellman_Ford算法求解,只需将其改为求最长路,判断图中是否有正环存在,在执行松弛操作时如果某一次没有发生松弛操作,则只需判断d[s]与原始钱的数目的大小关系即可;如果成功的松弛完毕,则说明图中存在着正环,就可以使货币增值.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Edge{
int u,v;
double rate,com;
};
Edge edge[205];
double d[105];
int n,m,s;
double v;
bool bellman_ford(){
memset(d,0,sizeof(d));
d[s]=v;
//这儿一开始写的是循环n-1次,但是结果不对;比如可能v先减小,然后不断增加,这个次数就不一定了,所以和书中的不太一样
for(;d[s]<=v;){
bool flag=false;
for(int j=0;j<2*m;j++){
double tmp=(d[edge[j].u]-edge[j].com)*edge[j].rate;
if(d[edge[j].v]<tmp){
d[edge[j].v]=tmp;
flag=true;
}
}
if(flag==false)
return d[s]>v;
}
return true;
}
int main(){
while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){
int u,v,k=0;
double r1,c1,r2,c2;
for(int i=0;i<m;i++){
scanf("%d%d%lf%lf%lf%lf",&u,&v,&r1,&c1,&r2,&c2);
edge[k].u=u;edge[k].v=v;
edge[k].rate=r1;edge[k].com=c1;
k++;
edge[k].u=v;edge[k].v=u;
edge[k].rate=r2;edge[k].com=c2;
k++;
}
if(bellman_ford())
printf("YES\n");
else
printf("NO\n");
}
//system("pause");
return 0;
}