zoukankan      html  css  js  c++  java
  • zoj 1092 Arbitrage

    题目大意是有n个国家之间的汇率,问是否存在从一个国家出发回到该国家后汇率乘积大于一,即套汇。

    可以用bellman做,因为是回路,所以要递推n次(多于n次无意义,因为若存在套汇,n次就知道了)。

    也可以用floyd算法,最后判断lowdist[ i ][ i ]即可。

    #include <stdio.h>
    #include <string.h>
    int n,m,flag;
    double maxdist[50];
    char name[50][20],a[20],b[20];
    struct exchange
    {
    	int ci;
    	int cj;
    	double cij;
    }ex[1000];
    void bellman(int u)
    {
    	int i,j;
    	memset(maxdist,0,sizeof(maxdist));
    	maxdist[u]=1;
    	for(i=1;i<=n;i++)
    	{
    		for(j=0;j<m;j++)
    		{
    			if(maxdist[ex[j].cj]<maxdist[ex[j].ci]*ex[j].cij)
    				maxdist[ex[j].cj]=maxdist[ex[j].ci]*ex[j].cij;
    		}
    	}
    	if(maxdist[u]>1.0)
    		flag=1;
    }
    
    
    int main()
    {
    	int i,j,k,sum=0;
    	double x;
    	while(1)
    	{
    		flag=0;
    		scanf("%d",&n);
    		if(n==0)
    			break;
    		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;
    		}
    		for(i=0;i<n;i++)
    		{
    			bellman(i);
    			if(flag)
    				break;
    		}
    		sum+=1;
    		if(flag)
    			printf("Case %d: Yes
    ",sum);
    		else
    			printf("Case %d: No
    ",sum);
    	}
    	return 0;
    }
    
    


     

  • 相关阅读:
    paip.重装系统需要备份的资料总结..
    poj3078
    poj3009
    poj2151
    poj3274
    poj3436
    VC++:打开、保存文件对话框和浏览文件夹对话框
    目前所有的视频格式都有哪些?
    CMSHFlexGrid 类用法
    Matlab的ActiveX接口_百度文库
  • 原文地址:https://www.cnblogs.com/vermouth/p/3710226.html
Copyright © 2011-2022 走看看