poj 1860 Currency Exchange(最短経路の応用)
2168 ワード
http://poj.org/problem?id=1860
: , Rab, Cab 。。。。。。。 ( - ) * , , value , 。
:
3 2 1 20.0 // , ,
1 2 1.00 1.00 1.00 1.00 // a, b, rab, cab, rba, cba
2 3 1.10 1.00 1.10 1.00
: bellman-ford :
bellman ( ) ( ) , - 1 , 。 , 。 ( )
, bellman , - 1 , - 1 , , , d[u] d[ (v)] , , , 。
2 :
1。 , , d[x] value 。
2。 d[x] 〉value , , , , 。
,
#include<stdio.h>
#define N 50000
#include<string.h>
#define max 999999
#define eps 1e-6
int n,m,x,vis[N],k;
double val,dis[N];// dis double
struct node
{
int u,v;
double r,c;
}p[N];
int bellman(int x)
{
int i,f;
memset(vis,0,sizeof(vis));
for(i=0;i<=n;i++)
{
dis[i]=0;
}
dis[x]=val;
while(dis[x]<=val+eps)
{
f=0;
for(i=0;i<k;i++)
{
if(dis[p[i].v]+eps<(dis[p[i].u]-p[i].c)*p[i].r)
{
dis[p[i].v]=(dis[p[i].u]-p[i].c)*p[i].r;
f=1;
}
}
if(!f)return 0;//
}
return 1;
}
int main()
{
int i,u,v;
double rvu,cvu,ruv,cuv;
while(scanf("%d%d%d%lf",&n,&m,&x,&val)!=EOF)
{
k=0;
for(i=0;i<m;i++)
{
scanf("%d%d%lf%lf%lf%lf",&u,&v,&ruv,&cuv,&rvu,&cvu);
p[k].u=u;
p[k].v=v;
p[k].r=ruv;
p[k].c=cuv;
k++;
p[k].u=v;
p[k].v=u;
p[k].r=rvu;
p[k].c=cvu;
k++;
}
int ans=bellman(x);
if(ans)printf("YES
");
else printf("NO
");
}
}