您的位置:首页 > 其它

poj 1860 最短路

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

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: