码迷,mamicode.com
首页 > 其他好文 > 详细

poj2240(Arbitrage)

时间:2014-07-11 18:24:14      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   art   

题目大意:

    给你各国的货币名称,和国家与国家之间兑换的汇率,问你通过一系列的兑换能否是自己的财富增加。

 

解题思路:

    先建图,因为给的是字符串不是阿拉伯数之间的联系,所以建图可以用map<string,int>mp 建图。赋值给结构体中的u,v。然后利用bellman—ford算法,因为如果财富能够通过兑换增值说明会有一条正权回路。所以利用bellman—ford算法 判断是否出现正权回路说明可以增值否则NO。

 

代码:

bubuko.com,布布扣
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <bitset>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <map>
#include <set>
using namespace std;
/***************************************/
#define ll long long
#define int64 __int64
/***************************************/
const int INF = 0x7f7f7f7f;
const double eps = 1e-8;
const double PIE=acos(-1.0);
const int dx[]= {0,-1,0,1};
const int dy[]= {1,0,-1,0};
const int fx[]= {-1,-1,-1,0,0,1,1,1};
const int fy[]= {-1,0,1,-1,1,-1,0,1};
/***************************************/
void openfile()
{
    freopen("data.in","rb",stdin);
    freopen("data.out","wb",stdout);
}
/**********************华丽丽的分割线,以上为模板部分*****************/
const int MAX=-1;
#define N 1000
int t,edgenum;
double w;
typedef struct Edge
{
    int u,v;
    double cost;
} Edge;
Edge edge[N];
double dis[N];
bool Bellman_ford()
{
    int i,j;
    for(i=1;i<=t;i++)
        dis[i]=MAX;
    dis[1]=1;
    for(i=1;i<=t-1;i++)
       for(j=1;j<=edgenum;j++)
           if (dis[edge[j].v]<dis[edge[j].u]*edge[j].cost)
                dis[edge[j].v]=dis[edge[j].u]*edge[j].cost;
    int flag=0;
    for(i=1;i<=edgenum;i++)
        if (dis[edge[i].v]<dis[edge[i].u]*edge[i].cost)
        {
            flag=1;
            break;
        }
    return flag;
}
int main()
{
    int cas=0;
    while(scanf("%d",&t)&&t)
    {
        map<string,int>mp;
        char a[50],b[50];
        int i,j;
        int num=0;
        for(i=0;i<t;i++)
            scanf("%s",a);
        scanf("%d",&edgenum);
        for(i=1;i<=edgenum;i++)
        {
            scanf("%s %lf %s",a,&w,b);
            if (mp[a]==0)
                mp[a]=++num;
            if (mp[b]==0)
                mp[b]=++num;
            edge[i].u=mp[a];
            edge[i].v=mp[b];
            edge[i].cost=w;
        }
        if (Bellman_ford())
            printf("Case %d: Yes\n",++cas);
        else
            printf("Case %d: No\n",++cas);
    }
    return 0;
}
View Code

 

poj2240(Arbitrage),布布扣,bubuko.com

poj2240(Arbitrage)

标签:style   blog   http   color   os   art   

原文地址:http://www.cnblogs.com/ZhaoPengkinghold/p/3833671.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!