标签:算法
此题可以用bellman-ford算法来求解。bellman-ford算法是求解最短路径,此题是求解如果结果是true,则dis[v]=(dis[s]-Cs->v)*Rs->v,用flag表示是否更新的话,那么返回的flag就是true,否则返回false。
此题参考了网上大神的思想
代码:
#include <iostream>
#include <string.h>
using namespace std;
int N;//货币种类
int M;//交换点次数
int S;//货币持有类型
double V;//货币持有此类型的数量
//定义交换货币的结构体
struct{
int a;//a货币
int b;//b货币
double C;//货币交换所需付的押金
double R;//货币交换的汇率
}exec[202];
int all; //边数
double dis[101];//N不超过100,各种货币的钱数。
bool bellmanford()
{
//初始化dis[exec[all].a-exec[all].C)*exec[all].R
memset(dis,0,sizeof(dis));
dis[S]=V;//因为输入时货币S是有钱数的。
bool flag=false;
for(int i=1;i<=N-1;i++)
{
for(int j=0;j<all;j++)
{
if(dis[exec[j].b]<(dis[exec[j].a]-exec[j].C)*exec[j].R)
{
dis[exec[j].b]=(dis[exec[j].a]-exec[j].C)*exec[j].R;
flag=true;
}
}
if(!flag)
break;
}
for(int j=0;j<all;j++)
if(dis[exec[j].b]<(dis[exec[j].a]-exec[j].C)*exec[j].R)
return true;
return false;
}
int main()
{
//定义临时变量
int a;
int b;
double rab;
double cab;
double rba;
double cba;
while(cin>>N>>M>>S>>V)
{
all=0;
for(int i=0;i<M;i++)
{
cin>>a>>b>>rab>>cab>>rba>>cba;
exec[all].a=a;
exec[all].b=b;
exec[all].R=rab;
exec[all++].C=cab;
exec[all].a=b;
exec[all].b=a;
exec[all].R=rba;
exec[all++].C=cba;
}
if(bellmanford())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}标签:算法
原文地址:http://blog.csdn.net/ztzi321/article/details/42153383