poj 1860 Currency Exchange SPFA

算法:

1.SPFA求最长路,dis【】初始直为0,大于改成小于号

2.松弛结束后,判断是否大于dis[S] > V, 大于就输出YES, 否则输出NO

 

View Code
#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <queue>

#include <math.h>

#include <algorithm>

#define MAXN 100100

using namespace std;



struct Edge

{

  int u, next;

  double val, cost;

  Edge( ) { }

  Edge( int U, int Next, double Val, double Cost): u(U), next(Next), val(Val), cost(Cost) {}

}edge[MAXN];



int N, M, S, head[MAXN], visit[MAXN], hash[MAXN], size;

double V, dis[MAXN];



struct node

{

  int ID;

 // double rate;

  double money;

 // double c;

};



void init( )

{

  for( int i = 0; i < MAXN; i++)

  {

       head[i] = -1;

       dis[i] = 0;

       visit[i] = 0;

       hash[i] = 0;

  }

  size = 0;    

  

}



void AddEdge( int u, int v, double val1, double val2, double Cost1, double Cost2)

{

   edge[size] = Edge( v, head[u], val1, Cost1);

   head[u] = size++;

   edge[size] = Edge( u, head[v], val2, Cost2);

   head[v] = size++;     

     

}



void SPFA( )

{

   queue<node>q;

   node p;

   p.ID = S;

   p.money = V;

   q.push( p );

   dis[S] = V;

   hash[S] = 1;

   while( !q.empty())

   {

      p = q.front( );

      q.pop( );

      int v = p.ID;

      double money = dis[v];

      visit[v] = 0;

      for( int e = head[v]; e != -1; e = edge[e].next)

      {

          int v = edge[e].u;

          double rate = edge[e].val;

          double cost = edge[e].cost;

          double xx = rate * ( money - cost );

          if( dis[v] < xx )

          {

              dis[v] = xx;

              if( !visit[v] )

              {

                  p.ID = v;

                  p.money = dis[v];

                  q.push( p );

                  visit[v] = 1;

                  hash[v]++;        

                  

              }

              

          }      

      

      }

            

   }
 if( fabs(dis[S]) - V > 0 )

     puts("YES");

 else

     puts("NO"); 

     

}



int  main( )

{

  int a, b;

  double rab, cab, rba, cba;

  while( scanf("%d%d%d%lf",&N, &M, &S, &V) != EOF)

  {

     init( );

     for( int i = 1; i <= M; i++)

     {

        scanf("%d%d%lf%lf%lf%lf",&a, &b, &rab, &cab, &rba, &cba);

        AddEdge( a, b, rab, rba, cab, cba);

     }    

     SPFA( );

  }

  return 0;   

} 

转载于:https://www.cnblogs.com/tangcong/archive/2012/07/10/2584819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值