POJ 2240 Arbitrage (BELLMAN-FORD)

思路:用BELLMAN-FORD算法求从源点SRC出发到各个顶点V(包括SRC本身)的最长路径长度,这里路径长度不是权值之和,而是权值乘积。

代码:

#include <stdio.h>
#include <string.h>

#define inf 1000000
#define MAXN 35

int n,m,a,b;

char hash[MAXN][100];
double edge[MAXN][MAXN];

char str1[100],str2[100];
double len;

double dist[MAXN];

int flag;

int hex(char str[])
{
	for(int i=0; i<n; i++)
		if(strcmp(str,hash[i])==0) return i;
	return -1;
}

int addedge(int a,int b,double len)
{
	edge[a][b]=len;
}

void bellman(int src)
{
	flag=0;
	
	for(int i=0; i<n; i++) {
		dist[i]=0;
	}
	
	dist[src]=1.0;
	
	for(int k=0; k<n; k++) {
		for (int u=0; u<n; u++) {
			for (int j=0; j<n; j++) {
				if(dist[j]*edge[j][u]>dist[u]) {
					dist[u]=dist[j]*edge[j][u];
				}
			}
		}
	}
	
	if(dist[src]>1.0) flag=1;
}

int main()
{
	int casea=1;
	while (scanf("%d",&n),n) {

		for (int i=0; i<n; i++) {
			for (int j=0; j<n; j++) {
				edge[i][j]=0;
			}
		}

		for (int i=0; i<n; i++) {
			scanf("%s",hash[i]);
		}
		scanf("%d",&m);

		for (int i=0; i<m; i++) {
			scanf("%s%lf%s",str1,&len,str2);
			a=hex(str1);
			b=hex(str2);
			addedge(a,b,len);
		}

		for (int i=0; i<n; i++) {
			bellman(i);
			if(flag) break;
		}

		if(flag) printf("Case %d: Yes\n",casea++);
		else printf("Case %d: No\n",casea++);
	}
}

  

posted on 2011-07-23 03:05  Eucalyptus  阅读(304)  评论(0编辑  收藏  举报