POJ 2240 Arbitrage (Floyd)

 也是一道资金兑换的题..

直接按照比例兑,而且没有给起始点,考虑用Floyd算法.

但是Floyd稍微有些修改,加法改为乘法,使该点到其他点汇率最大

最终要换回自己d[i][j]是i换j的最大汇率,而d[j][i]则是j换回i的最大汇率,所以最后只要枚举d[i][j]*d[j][i]即可,看是否有结果大于1.

#include <cstdio>
#include <string.h>
#include <math.h>
#define INF 1e5 
using namespace std;
double rate[32][32];
double sa[32][32];
char node[32][35];
int n,p;
void init (int n){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			rate[i][j]=(i==j)?0:INF;
		}
	}
}
int floyd(){
	for(int k=1;k<=n;k++){//改为乘法
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(rate[i][j]<rate[i][k]*rate[k][j])rate[i][j]=rate[i][k]*rate[k][j];
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(rate[i][j]*rate[j][i]>1)return 1;
		}
	}
	return 0;
}
int main(){
	//freopen("in.txt","r",stdin);
	int nCase=1,s,e;
	char st[35],en[35];
	double r;
	while(scanf("%d",&n)&&n){
		init(n);
		for(int i=1;i<=n;i++){
			scanf("%s",node[i]);
		}
		scanf("%d",&p);
		for(int i=1;i<=p;i++){//将国家字符串转换成数组
			scanf("%s%lf%s",st,&r,en);
			for(int j=1;j<=n;j++){
				if(strcmp(st,node[j])==0)s=j;
				if(strcmp(en,node[j])==0)e=j;		
			}
			rate[s][e]=r;
		}
		printf("Case %d: ",nCase++); 
		printf(floyd()?"Yes\n":"No\n");
	}
	return 0;
} 


 

你可能感兴趣的:(POJ 2240 Arbitrage (Floyd))