POJ-2240 Arbitrage bellman

跟POJ-1860基本一样,bellman求是否存在环。这里吸取了别人的代码,让bellman算法的外循环直接增加一次,再判定是否在这个过程中有无更新推出的情况。

代码如下:

#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <map>
#include <string>
using namespace std;

int N, pos, cnt;
double dis[35];
map<string,int>mp;

struct Node
{
    int x, y;
    double rate;
}e[905];

bool bellman()
{
    int flag;
    fill(dis, dis+35, 1000);
    for (int i = 1; i <= N; ++i) {
        flag = 0;
        for (int j = 1; j <= pos; ++j) {
            if (dis[ e[j].x ] * e[j].rate - dis[ e[j].y ] > 1e-6) {
                dis[ e[j].y ] = dis[ e[j].x ] * e[j].rate;
                flag = 1;
            }
        }
        if (!flag) {
            break;
        }
    }
    if (flag) {
        return true;
    }
    else {
        return false;
    }
}

int main()
{
    int M, ca = 0;
    char a[105], b[105];
    double rate;
    while (scanf("%d", &N), N) {
        mp.clear();
        pos = cnt = 0;
        for (int i = 1; i <= N; ++i) {
            scanf("%s", a);
            mp[a] = ++cnt;
        }
        scanf("%d", &M);
        for (int i = 1; i <= M; ++i) {
            scanf("%s %lf %s", a, &rate, b);
            ++pos;
            e[pos].x = mp[a], e[pos].y = mp[b];
            e[pos].rate = rate;
        }
        printf("Case %d: ", ++ca);
        printf(bellman() ? "Yes\n" : "No\n");
    }
    return 0;
}
posted @ 2012-07-01 15:28  沐阳  阅读(200)  评论(0编辑  收藏  举报