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;

}

你可能感兴趣的:(poj)