Arbitrage

Arbitrage

判正环

套利问题,给出若干对货币兑换的汇率,求能否通过汇率兑换使钱越来越多

  1. floyd求最长路,如果某一点到自身的最长路大于 1, 则可以
  2. tarjan 判正环
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
const int N = 50;
map<string, int> mp;
int idx, n, m;
double f[N][N];
int find(string &s)
{
	if (mp.count(s))
		return mp[s];
	return mp[s] = ++idx;
}

void init()
{
	mp.clear();
	idx = 0;
	for (int i = 0; i <= n; i++)
		for (int j = 0; j <= n; j++)
			f[i][j] = 0;
}

void floyd()
{
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				f[i][j] = max(f[i][j], f[i][k] * f[k][j]);
}
int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int t = 0;
	while(cin >> n, n)
	{
		init();
		++t;
		for (int i = 1; i <= n; i++)
		{
			string s;
			cin >> s;
			find(s);
		}
		cin >> m;
		while(m--)
		{
			string s1, s2;
			double x;
			cin >> s1 >> x >> s2;
			f[mp[s1]][mp[s2]] = x;
		}
		floyd();
		bool flag = false;
		for (int i = 1; i <= n; i++)
		{
			if (f[i][i] > 1)
			{
				flag = true;
				break;
			}
		}
		cout << "Case " << t << ": ";
		cout << (flag ? "Yes" : "No") << endl;
	}
	return 0;
}

posted @   hzy0227  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示