您的位置:首页 > 其它

POJ 2240 解题报告

2011-05-07 18:34 417 查看
套汇差就是汇率的图中存在一条汇率乘积大于1的环。因为一开始已经明确是Bellman-Ford算法,所以把汇率c变成-log(c)付给边作权,这样就是看这个图是否存在权值和为负数的环,用该算法就非常地道了。

#include <cstdio>
#include <cmath>
#include <map>
#include <string>

using namespace std;

struct tagTuple {  // store edge info
int u;
int v;
double w;
};

int main() {
int n, m, i, j, k;
char buf1[1024], buf2[1024];
double weight;
tagTuple edges[900];

double d[30];
bool still_init[30];

for (int t = 1; ;++t) {
scanf("%d", &n);
if (n == 0) {
break;
}

// reading currency names, building map.
std::map<std::string, int> cur_map;
for (i = 0; i < n; ++i) {
scanf("%s", buf1);
cur_map[buf1] = i;
}

// reading exchange rates, building graph.
scanf("%d", &m);
for (i = 0; i < m; ++i) {
scanf("%s%lf%s", buf1, &weight, buf2);
edges[i].u = cur_map[buf1];
edges[i].v = cur_map[buf2];
edges[i].w = -log(weight);
}

// bellman-ford algorithm
double tmp;
for (i = 0; i < n; ++i) {
memset(still_init, true, sizeof(still_init));
d[i] = 1.0;
still_init[i] = false;
for (j = 0; j < n - 1; ++j) {
for (k = 0; k < m; ++k) {
if (still_init[edges[k].u]) {
continue;
}
tmp = d[edges[k].u] + edges[k].w;
if (still_init[edges[k].v]) {
d[edges[k].v] = tmp;
still_init[edges[k].v] = false;
} else if (d[edges[k].v] > tmp) {
d[edges[k].v] = tmp;
}
}
}

int j;
for (j = 0; j < m && (d[edges[j].v] <= d[edges[j].u] + edges[j].w + 1e-8); ++j);  // 这里可能因为是浮点数,比较时要注意!
if (j < m) {
break;
}
}
if (i < n) {
printf("Case %d: Yes/n", t);
} else {
printf("Case %d: No/n", t);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: