POJ - 2240 Arbitrage

POJ - 2240 题目链接

本来是一道非常简单的题,但是我wa了这么多


POJ - 2240 Arbitrage_第1张图片

首先我得说一下POJ了,不支持 #include

#define要加 #include 的头文件又长见识了。
然后就是我自己的原因的,我在代码里面详细说明吧

思路

从例子中我们呢可以判断出,这是一道判断环的问题,这个专题之前也写过一道类似的题目,30的数据量,那就直接floyd吧

代码

Powered by CK
#include
#include
#include
#include
#include
#include
#include
#define esp 1e-8
using namespace std;
const int N = 110;
double ans[N][N];
int n, m;
map mp;//这里存的是对应的货币的数字,每种货币对应一个数字。
void init() {//多组输入初始化很重要
    memset(ans, 0, sizeof ans);
    mp.clear();
}
bool Floyed() {
    for(int i = 1; i <= n; i++) ans[i][i] = max(ans[i][i], 1.0);//第二个坑,如果输入的时候可能会出现同种货币的交换,而且汇率大于1
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                if(ans[i][j] < ans[i][k] * ans[k][j])
                    ans[i][j] = ans[i][k] * ans[k][j];
            }
                if(ans[i][i] > 1.0)   return true;
        }
    return false;
}
int main() {
    ios::sync_with_stdio(false);
    string x, y;
    double w;
    int cas = 1;
    while(cin >> n && n) {
        init();
        for(int i = 1; i <= n; i++) {
            cin >> x;
            mp[x] = i;
        }
        cin >> m;
        for(int i = 0; i < m; i++) {
            cin >> x >> w >> y;
            ans[mp[x]][mp[y]] = max(w, ans[mp[x]][mp[y]]);//第一个坑,邻阶矩阵存图,判断最优边权很重要。
        }
        if(Floyed())cout << "Case " << cas++ << ": Yes" <

你可能感兴趣的:(POJ - 2240 Arbitrage)