poj 1860 Currency Exchange(bellm…

题意: 每种货币间有一定的交换比率,而且要付一定的佣金,问nick 经过多次交换后,能否赚钱

思路:原来以为 经过NE次松驰后,只要dis[src] > w 他就能赚钱 但想想这是错了。而应该是判断有没有存在正环 因为 可能NE次松驰后,dis[src] 没有大于w 但它存在正环,只要再继续松驰,就一定有dis[src] > w;

#include <stdio.h>
#define M 105
//#define inf 0x3f3f3f3f

int edgenum;
struct node
{
      int v1,v2;
      double rate,c;
} edge[M*M];

int bellman (int n,int src,double w)
{
      double dis[M];
      int i,j;
      for (i = 1; i <= n; i ++)
              dis[i] = 0;
      dis[src] = w;
      for (i = 1; i <= n; i ++)
      {
              int finish = 0;
              for (j = 1; j <= edgenum; j ++)
              {
                      int u = edge[j].v1;
                      int v = edge[j].v2;
                      double r = edge[j].rate;
                      double c = edge[j].c;

                      if (dis[v] < (dis[u]-c)*r)
                      {
                              dis[v] = (dis[u]-c)*r;
                              finish = 1;
                      }
              }
              if (!finish) break;                      //从别人那学来的优化
      }

      if (i == n+1)      //存在正环
              return 1;
      else
              return 0;
}
int main ()
{
      int n,m,s;
      int i,j,k,u,v;
      double cost,ruv,cuv,rvu,cvu;
      k = 0;
      scanf ("%d%d%d%lf",&n,&m,&s,&cost);
      while (m --)
      {
              scanf ("%d%d%lf%lf%lf%lf",&u,&v,&ruv,&cuv,&rvu,&cvu);
              k++;
              edge[k].v1 = u;
              edge[k].v2 = v;
              edge[k].rate = ruv;
              edge[k].c = cuv;
              k++;
              edge[k].v1 = v;
              edge[k].v2 = u;
              edge[k].rate = rvu;
              edge[k].c = cvu;
      }
      edgenum = k;
      int ans = bellman(n,s,cost);
      if (!ans)
              printf ("NO\n");
      else
              printf ("YES\n");
      return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值