码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2240 Arbitrage

时间:2015-01-23 14:39:10      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

 

/*
*POJ 2240 Arbitrage
*求从源点v0出发 到各点(包括其本身)最长路径(权值乘积)
*
*/

#include <cstdio>
#include <cstring>
#define MAXN 50 //顶点数最大值
#define MAXM 1000 //边最大值
#define max(a, b) ((a) > (b) ? (a) : (b))

struct exchange {
	int ci, cj;
	double cij;
} ex[MAXM]; //汇率关系
int i, j, k;
int n, m; //货币种类 汇率数目
char name[MAXN][20], a[20], b[20]; //货币名称
double x; //汇率
double maxdist[MAXN]; //源点i到其他每个顶点(包括本身)的最长路径长度
int flag; //存在套汇标志
int kase = 0;
int readcase()
{
	scanf("%d", &n);
	if (n == 0) {
		return 0;
	}
	for (i = 0; i < n; i++) {
		scanf("%s", name[i]);
	}
	scanf("%d", &m);
	for (i = 0; i < m; i++) {
		scanf("%s %lf %s", a, &x, b);
		for (j = 0; strcmp(a, name[j]); j++) ;
		for (k = 0; strcmp(b, name[k]); k++) ;
		ex[i].ci = j;
		ex[i].cij = x;
		ex[i].cj = k;
	}
	return 1;
}

void bellman(int v0)
{
	flag = 0;
	memset(maxdist, 0, sizeof(maxdist));
	maxdist[v0] = 1;
	for (k = 1; k <= n; k++) {
		for (i = 0; i < m; i++) { //判断每条边 加入它是否能使最大距离增加
			if (maxdist[ex[i].ci] * ex[i].cij > maxdist[ex[i].cj]) {
				maxdist[ex[i].cj] = maxdist[ex[i].ci] * ex[i].cij;
			}
		}
	}
	if (maxdist[v0] > 1.0) {
		flag = 1;
	}
}

int main(void)
{
	while (readcase()) {
		for (i = 0; i < n; i++) {
			bellman(i);
			if (flag) {
				break;
			}
		}
		if (flag) {
			printf("Case %d: Yes\n", ++kase);
		} else {
			printf("Case %d: No\n", ++kase);
		}
	}
	return 0;
}

  

POJ 2240 Arbitrage

标签:

原文地址:http://www.cnblogs.com/subrshk/p/4244115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!