当前位置: 代码迷 >> 综合 >> HDU 1217 - Arbitrage
  详细解决方案

HDU 1217 - Arbitrage

热度:28   发布时间:2023-12-24 11:19:24.0

题目大意:有n种货币,有m家交易点,每个交易点只支持一种货币兑换另一种货币。问是否能够通过兑换货币变得更富有。

解题思路:与POJ1860是类似的,用bellman_ford算法,交易只能单向交易,初始化其中某种货币为1,要更富有,松弛往大松弛。经过n次的松弛操作,如果还能继续松弛说明可以变得更富有。

ac代码:

#include <iostream>
#include <map>
#include <string>
#include <cstring>
using namespace std;
map <string, int>ma;
int n, m, u[1005], v[1005], kk, ll, cnt=1, flag;
double ratio, w[1005], dis[35];
char bank[1005], t1[1005], t2[1005];
int main()
{while (scanf("%d", &n)!=EOF && n){memset(dis, 0, sizeof(dis));getchar();for (int i=1; i<=n; i++){scanf("%s", bank);ma[bank] = i;	}dis[1] = 1; flag = 0;scanf("%d", &m);getchar();for (int i=0; i<m; i++){scanf("%s%lf%s", t1, &ratio, t2);u[i] = ma[t1], v[i] = ma[t2];w[i] = ratio;}dis[1] = 1;for (int i=1; i<n; i++)for (int j=0; j<m; j++){kk = u[j], ll = v[j];if (dis[ll] < dis[kk] * w[j])dis[ll] = dis[kk] * w[j];}for (int j=0; j<m; j++){kk = u[j], ll = v[j];if (dis[ll] < dis[kk] * w[j])flag = 1;}if (flag)printf("Case %d: Yes\n", cnt++);elseprintf("Case %d: No\n", cnt++);ma.clear();}
return 0;
}