跟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; }