poj-2240-Arbitrage(bellmen-ford)

来源:互联网 发布:淘宝卖家团购怎么弄 编辑:程序博客网 时间:2024/05/19 13:59

货币之间的转化问题,用到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;}


原创粉丝点击