poj 1860 最短路

题目大意:给你多个货币交换点,每次从一个货币到另一个货币的都会产生手续费和汇率,现在给你一个确定的货币和这个货币的数量,问你,通过交换,最后再返回题目给出的那个确定的货币,如果货币数量增加了则输出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;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值