POJ - 2240 Arbitrage

POJ - 2240 题目链接

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


首先我得说一下POJ了,不支持 #include<bits/stdc++.h>

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

思路

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

代码

Powered by CK
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<string>
#include<map>
#include<cstring>
#define esp 1e-8
using namespace std;
const int N = 110;
double ans[N][N];
int n, m;
map<string, int> 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" <<endl;
		else cout << "Case " << cas++ << ": No" << endl;
    }
    return 0;
}
posted @ 2020-04-02 21:30  lifehappy  阅读(144)  评论(0)    收藏  举报