题目大意:
给你各国的货币名称,和国家与国家之间兑换的汇率,问你通过一系列的兑换能否是自己的财富增加。
解题思路:
先建图,因为给的是字符串不是阿拉伯数之间的联系,所以建图可以用map<string,int>mp 建图。赋值给结构体中的u,v。然后利用bellman—ford算法,因为如果财富能够通过兑换增值说明会有一条正权回路。所以利用bellman—ford算法 判断是否出现正权回路说明可以增值否则NO。
代码:
#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; }
poj2240(Arbitrage)
时间: 2024-11-08 14:34:52