当前位置: 代码迷 >> 综合 >> poj-2240-Arbitrage(bellmen-ford)
  详细解决方案

poj-2240-Arbitrage(bellmen-ford)

热度:20   发布时间:2023-12-19 11:32:56.0

货币之间的转化问题,用到bellmen-ford求是否存在负权回路。如果存在负权回路,就输出yes。否则输出no。

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
struct listen
{int x;int y;double rate;
}dist[100000];
int main()
{int n,i,j,m,leap1,leap2;double rate;char money1[100],money2[100];char money[51][1000];int map[101][101];int case1=0;while(scanf("%d%*c",&n)&&n){case1++;memset(map,-1,sizeof(map));for(i=0;i<n;i++){gets(money[i]);}scanf("%d%*c",&m);for(i=0;i<m;i++){scanf("%s %lf %s%*c",money1,&rate,money2);leap1=leap2=-1;for(j=0;j<n;j++){if(strcmp(money1,money[j])==0){leap1=j;}if(strcmp(money2,money[j])==0){leap2=j;}}dist[i].x=leap1;dist[i].y=leap2;dist[i].rate=rate;}double have[100];memset(have,0,sizeof(have));have[0]=1;//让第一种货币有一块钱int flag;for(i=0;i<n;i++){//更新各个货币的相对拥有量,因为一共有N种货币,所以说如果不存在负权回路的话//最多更新n-1次就可以更新出来所有的货币的相对拥有量。//如果第n次更新,还有货币的相对拥有量变化,说明存在负权回路flag=0;for(j=0;j<m;j++){if(have[dist[j].x]*dist[j].rate>have[dist[j].y]){have[dist[j].y]=have[dist[j].x]*dist[j].rate;flag=1;//       printf("-------%d %d %f %f %f\n",dist[j].x,dist[j].y,have[dist[j].x],have[dist[j].y],dist[j].rate);}}if(flag==0)break;}printf("Case %d: ",case1);if(flag)printf("Yes\n");else printf("No\n");}return 0;
}