您的位置:首页 > 其它

PKU 1860

2011-04-06 19:05 246 查看
题目的大意是:有n种货币和m种转换方式,每种转换方式对应的汇率r和手续费c,假设原来的钱数是v,那么转换后的为(v-c)*r。现在给某种货币形式的钱数,问能否经过某些转换方式使得变回同种货币形式时钱数增加。
用到的算法是bellman()的最大路的松弛法。需要注意:1.满足正环条件就要不停松弛,直到dist[s]>value;2.如果不能循环了就要return dist[s]>value;
源程序:
#include<stdio.h>
#include<string.h>
typedef struct
{
int u,v;
double r,c;
}node;
node edge[1002];
double value;
int n,m,s,eg;
int bellman()
{
double dist[102];
int i,temp;
memset(dist,0,sizeof(dist));
dist[s]=value;
while(dist[s]<=value)
{
temp=0;
for(i=0;i<eg;i++)
{
if(dist[edge[i].v]<(dist[edge[i].u]-edge[i].c)*edge[i].r)
{
dist[edge[i].v]=(dist[edge[i].u]-edge[i].c)*edge[i].r;
temp=1;
}
}
if(temp==0)
return dist[s]>value;
}
return 1;
}
int main()
{
int i,a,b;
double rab,cab,rba,cba;
while(scanf("%d%d%d%lf",&n,&m,&s,&value)!=EOF)
{
eg=0;
for(i=0;i<m;i++)
{
scanf("%d%d%lf%lf%lf%lf",&a,&b,&rab,&cab,&rba,&cba);
edge[eg].u=a;
edge[eg].v=b;
edge[eg].r=rab;
edge[eg].c=cab;
eg++;
edge[eg].u=b;
edge[eg].v=a;
edge[eg].r=rba;
edge[eg].c=cba;
eg++;
}
if(bellman())
printf("YES\n");
else printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: