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;
}
用到的算法是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;
}
相关文章推荐
- PKU 1860 Currency Exchange 最短路 bellman
- PKU1860--Currency Exchange
- PKU1860 Currency Exchange bellman求最长路
- pku 1860 Currency Exchange 第一周训练_最短路 spfa
- pku 1860 Currency Exchange(Bellman-Ford )
- pku 1860 Currency Exchange
- PKU ACM 1860 Bellman - Ford 算法
- pku1860 Currency Exchange
- pku 1088 滑雪
- pku 1008 Maya Calendar
- pku 3259 Wormholes
- PKU1435 gates
- pku2208pyramids
- pku1190 cake
- pku1833排列
- pku1011
- pku3308 【论】如何将二分图顶点覆盖问题转化为最小割
- PKU 3438 look and say
- pku 2575 Jolly Jumper
- PKU2533 最长上升子序列 DP