zoukankan      html  css  js  c++  java
  • hdu 1217 汇率 Floyd

    题意:给几个国家,然后给这些国家之间的汇率。判断能否通过这些汇率差进行套利交易。

    Floyd的算法可以求出任意两点间的最短路径,最后比较本国与本国的汇率差,如果大于1,则可以。否则不可以。

    有向图 一个点到另一点的花费为权值相乘 求乘积的最大值 从点i出发 再回到点i的花费如果大于1 就可以

    Sample Input
    3
    USDollar
    BritishPound
    FrenchFranc
    3
    USDollar 0.5 BritishPound
    BritishPound 10.0 FrenchFranc
    FrenchFranc 0.21 USDollar

    3
    USDollar
    BritishPound
    FrenchFranc
    6
    USDollar 0.5 BritishPound
    USDollar 4.9 FrenchFranc
    BritishPound 10.0 FrenchFranc
    BritishPound 1.99 USDollar
    FrenchFranc 0.09 BritishPound
    FrenchFranc 0.19 USDollar

    0

    Sample Output
    Case 1: Yes
    Case 2: No

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <string>
     5 # include <algorithm>
     6 # include <cmath>
     7 # include <map>
     8 # define LL long long
     9 using namespace std ;
    10 
    11 map<string,int>name;
    12 const int MAXN = 35 ;
    13 double dis[MAXN][MAXN];
    14 int n ;
    15 
    16 void floyed()//节点从1~n编号
    17 {
    18     int i,j,k;
    19     for(k=1;k<=n;k++)
    20        for(i=1;i<=n;i++)
    21          for(j=1;j<=n;j++)
    22              if(dis[i][k]*dis[k][j] > dis[i][j])
    23                  dis[i][j]=dis[i][k]*dis[k][j];
    24 
    25 }
    26 
    27 int main()
    28 {
    29     //freopen("in.txt","r",stdin) ;
    30     int i,m,j;
    31     string str1,str2;
    32     double w;
    33     int iCase=0;
    34     while(scanf("%d",&n),n)
    35     {
    36         iCase++;
    37         for(i=1;i<=n;i++)
    38         {
    39             cin>>str1 ;
    40             name[str1]=i;
    41         }
    42         for(i=1;i<=n;i++)
    43            for(j=1;j<=n;j++)
    44            {
    45                if(i==j)dis[i][j]=1;
    46                else dis[i][j]=0;
    47            }
    48         scanf("%d",&m);
    49         while(m--)
    50         {
    51             cin>>str1>>w>>str2;
    52             dis[name[str1]][name[str2]]=w;
    53         }
    54         floyed();
    55         bool flag=false;
    56         for(i=1;i<=n;i++)
    57           if(dis[i][i]>1)
    58           {flag=true;break;}
    59         if(flag)  printf("Case %d: Yes
    ",iCase);
    60         else printf("Case %d: No
    ",iCase);
    61     }
    62     return 0;
    63 }
    View Code
  • 相关阅读:
    队列的顺序存储实现
    栈的顺序存储实现2
    企业版循环单链表
    STL-list
    EXCEL多条件查询之VLOOKUP+IF{1,0} 踩坑
    MybatisPlus Wrapper方法
    sequence:创建、使用
    Java中List集合去除重复数据的方法
    windows下安装nginx和常用命令
    MySQL8.0.20下载并安装
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/4588134.html
Copyright © 2011-2022 走看看