题意 一种钱换成另一种钱需要手续费 然后按税率兑换 求是否能通过兑换使自己钱增加
例如 200的a1换成a2 手续费c 税率r 最终得到(200-c)* r
最长路 使用bellman_ford算法
求是否出现无限循环的最长路
#include<cstdio>
using namespace std;
#define M 505
int n,m,s;
double val;
struct Node
{
int u,v;
double r,c;
}a[M];
double dis[M];
void add(int num,int u,int v,double r,double c)
{
a[num].u=u;
a[num].v=v;
a[num].r=r;
a[num].c=c;
}
bool cal()
{
int i;
int t=n;
for(i=1;i<=n;i++)
{
dis[i]=0;
}
dis[s]=val;
while(t--)
{
bool bf=false;
for(i=0;i<m*2;i++)
{
if(dis[a[i].v]<(dis[a[i].u]-a[i].c)*a[i].r)
{
dis[a[i].v]=(dis[a[i].u]-a[i].c)*a[i].r;
bf=true;
}
}
if(!bf)
{
break;
}
}
bool bans=false;
if(t<0)
{
bans=true;
}
return bans;
}
int main()
{
while(~scanf("%d%d%d%lf",&n,&m,&s,&val))
{
int i,u,v;
double r,c;
for(i=0;i<m;i++)
{
scanf("%d%d%lf%lf",&u,&v,&r,&c);
add(i,u,v,r,c);
scanf("%lf%lf",&r,&c);
add(i+m,v,u,r,c);
}
if(cal())
{
puts("YES");
}
else
{
puts("NO");
}
}
return 0;
}
本文介绍了一种利用Bellman-Ford算法检测货币兑换过程中是否存在无限循环以获取利润的方法。通过构建图模型,每条边代表从一种货币转换到另一种货币的过程,并考虑手续费和税率的影响。
258

被折叠的 条评论
为什么被折叠?



