POJ 2240 Arbitrage(map + floyed)
Solution
最短路变形,只要最后有一点到自己的最长路大于 1 说明可以一直刷钱
(floyed,我滴超人!)
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<cmath>
#include<string>
#include<queue>
#include<set>
//#define int long long
using namespace std;
typedef pair<int, int> pii;
typedef double dd;
typedef long long ll;
const int MAXN = 50;
const int MAXM = 100010;
const dd eps = 1e-6;
const int inf = 0x3f3f3f3f;
int n, m;
dd dis[MAXN][MAXN];
int main()
{
int cnt = 0;
while (cin >> n && n)
{
memset(dis, 0, sizeof(dis));
for (int i = 1; i <= n;i++)
dis[i][i] = 1;
map<string, int> mp;
for (int i = 1; i <= n;i++)
{
string s;
cin >> s;
mp[s] = i;
}
cin >> m;
for (int i = 1; i <= m;i++)
{
string s1, s2;
dd x;
cin >> s1 >> x >> s2;
dis[mp[s1]][mp[s2]] = x;
}
for (int k = 1; k <= n;k++)
{
for (int i = 1; i <= n;i++)
{
for (int j = 1; j <= n;j++)
{
dis[i][j] = max(dis[i][j], dis[i][k] * dis[k][j]);
}
}
}
bool ok = 0;
for (int i = 1; i <= n;i++)
if (dis[i][i] > 1)
{
ok = 1;
break;
}
if(ok)
printf("Case %d: Yes\n", ++cnt);
else
printf("Case %d: No\n", ++cnt);
}
}