题目大意:给你多个货币交换点,每次从一个货币到另一个货币的都会产生手续费和汇率,现在给你一个确定的货币和这个货币的数量,问你,通过交换,最后再返回题目给出的那个确定的货币,如果货币数量增加了则输出yes否则输出no。
注意:1、只能用double如果用其他会出现精度问题。
这个题目的关键点在于反向用mellman_ford。
代码:
#include
using namespace std;
int t ;
int farm1[10010] , farm2[10010] ;
double w[10010][2];
double dist[120] ;
int main()
{
int n , m , s , i , j = 0;
double v;
cin>>n>>m>>s>>v;
int x = 0, y = 0;
double rate = 0.0, com = 0.0;
for(i = 0 ; i < m;i++)
{
cin>>x>>y>>rate>>com;
farm1[j] = x ; farm2[j] = y;
w[j][0] = rate ;
w[j][1] = com ;
j += 1;
cin>>rate>>com;
farm2[j] = x; farm1[j] = y;
w[j][0] = rate; w[j][1] = com ;
j += 1;
}
for(i = 1 ; i <= n ; i++)
dist[i] = 0.0 ;
dist[s] = v;
for(int k = 1 ; k < n; k++)
{
for(i = 0 ; i < j; i++)
{
x = farm1[i] ; y = farm2[i];
if(dist[y] < (dist[x]-w[i][1])*w[i][0]) dist[y] = (dist[x]-w[i][1])*w[i][0];
}
}
int d = 0 ;
for(i = 0 ; i < j ; i++)
{
x = farm1[i] ; y = farm2[i];
if(dist[y] < (dist[x]-w[i][1])*w[i][0] ) { d = 1 ;break;}
}
if(d ) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}