http://poj.org/problem?id=1860
题目类似于套汇,不过多加了一个条件,就是每次转换的时候有一定的手续费。
直接用bellman-ford算法,注意数据是double类型的,所以初始化的时候,还是使用循环比较好,直接用memset函数会出错。再有就是对于更新的次数要在10000左右,开始的时候没让循环那么多次,结果wrong,改成10000之后就AC了。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
const int maxn = 105 ;
#define INF 10000
struct Node
{
double c ;
double r ;
};
Node map[maxn][maxn] ;
double dist[maxn] ;
int m ;
int n ;
int s ;
double sum ;
void bellman(int v) ;
int main()
{
int i ;
int j ;
int p ;
int q ;
double ra ;
double ca ;
double rb ;
double cb ;
scanf("%d%d%d%lf" , &n , &m , &s ,&sum) ;
for(i = 0 ; i <= n ; i ++)
{
for(j = 0 ; j <= n ; j ++)
{
map[i][j].c = -1 ;
map[i][j].r = -1 ;
}
}
for(i = 0 ; i < m ; i ++)
{
scanf("%d%d%lf%lf%lf%lf" , &p , &q , &ra , &ca , &rb , &cb) ;
map[p][q].c = ca ;
map[p][q].r = ra ;
map[q][p].c = cb ;
map[q][p].r = rb ;
}
bellman(s) ;
if(dist[s] > sum)
printf("YES\n") ;
else
printf("NO\n") ;
return 0 ;
}
void bellman(int v)
{
int i ;
int j ;
int k ;
for(i = 1 ; i <= n ; i ++)
{
if(map[v][i].c >= 0)
dist[i] = (sum-map[v][i].c) * map[v][i].r ;
else
dist[i] = -1.0 ;
}
dist[v] = sum ;
for(i = 1 ; i <= INF ; i ++ )
{
for(j = 1 ; j <= n ; j ++)//¸üе½jµãµÄÌ×»ã
{
for(k = 1 ; k <= n ; k ++)//¾¹ýkµã
{
if(map[k][j].c >= 0 && dist[j] < (dist[k] - map[k][j].c ) * map[k][j].r)
{
dist[j] = (dist[k] - map[k][j].c) * map[k][j].r ;
}
}
}
if(dist[v] > sum)
{
break ;
}
}
}