你们见过这么诡异的FLOYD吗?

先上题。

[Description]

货币的汇率存在差异。比如,如果1美元购买0.5英镑,1英镑买10法郎。而1法国法郎买0.21美元。然后,通过转换货币,一个聪明的交易者能够从1美元买0.5 * 10 * 0.21 = 1.05美元,获利5%。

你的任务是写一个程序,以一个货币汇率列表的作为输入,然后确定能不能获利。

[Intput]

输入包括多组測试数据,每组数据第一行一个数n(1<=n<=30),表示有n中货币,接下来n行。每行一种货币名称,名称内不会出现空格,接下来一行一个整数m,然后是m行,每行包括三部分Si,Rij,Sj,表示货币Si兑换成Sj的汇率为Rij。

每组数据用一个空行隔开。当n==0时,结束输入。

[Output]

对于每组数据输出一个”Case i: Yes”或”Case i: No”表示第i组数据是否可行。

[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 Onput]

Case 1: Yes

Case 2: No

乍一看好像是数学题,事实上嘛——————是图论(相信大家都看出来了吧)。

把汇率当做边,货币当做点。

FLOYD就好了嘛。

<span style="color:#660000;"><span style="font-size:18px;">for(int k=1;k<=n;k++)</span><span style="font-size:14px;">
</span><span style="font-size:18px;">for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j || i==k || j==k) continue;
if(dis[i][j]<dis[i][k]*dis[k][j])
{
dis[i][j]=dis[i][k]*dis[k][j];
}
}</span></span>

特别注意此题的转移方程:汇率什么的当然是要乘咯。

注意:此题千万不能排除自环(我下意识的代码让我调了几个小时),即自己换自己汇率大于1(这尼玛不科学!

<span style="color:#3366ff;background-color: rgb(102, 255, 153);">#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
double dis[35][35];
char name[35][3110];
char tmp[3110];
int ansnum=0; int main()
{
while(1)
{
scanf("%d",&n);
if(n==0) break;
memset(name,0,sizeof(name));
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=0.0;
for(int i=1;i<=n;i++) scanf("%s",name[i]);
scanf("%d",&m);
int u,v;
double w;
for(int i=1;i<=m;i++)
{
memset(tmp,0,sizeof(tmp));
scanf("%s",tmp);
for(int j=1;j<=n;j++)
{
if(strcmp(tmp,name[j])==0)
{
u=j;
break;
}
}
scanf("%lf",&w);
memset(tmp,0,sizeof(tmp));
scanf("%s",tmp);
for(int j=1;j<=n;j++)
{
if(strcmp(tmp,name[j])==0)
{
v=j;
break;
}
}
dis[u][v]=max(dis[u][v],w);
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j || i==k || j==k) continue;
if(dis[i][j]<dis[i][k]*dis[k][j])
{
dis[i][j]=dis[i][k]*dis[k][j];
}
}
int ok=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
//if(i==j) continue;这句千万不能要
if(dis[i][j]*dis[j][i]>1.0)
{
ok=1;
}
if(ok) break;
}
if(ok) break;
}
printf("Case %d: ",++ansnum);
if(ok) printf("Yes\n");
else printf("No\n");
}
return 0;
}</span>

(诡异Floyd&amp;自环)MZ Training 2014 #15 E题(POJ 2240)的更多相关文章

  1. codeforce D. Shortest Cycle(floyd求最短环)

    题目链接:http://codeforces.com/contest/1206/problem/D 给n个点,如果点a[ i ] &a[ j ] 不为0,则点a[ i ] 和 a[ j ] 直 ...

  2. poj 2240 Arbitrage (Floyd)

    链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 Britis ...

  3. POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)

    POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...

  4. POJ2240 Arbitrage(Floyd判负环)

    跑完Floyd后,d[u][u]就表示从u点出发可以经过所有n个点回到u点的最短路,因此只要根据数组对角线的信息就能判断是否存在负环. #include<cstdio> #include& ...

  5. HDU 1317 XYZZY(floyd+bellman_ford判环)

    http://acm.hdu.edu.cn/showproblem.php?pid=1317 题意: 给出一个有向图,每到达一个点,都会加上或减去一些能量,我们要做的就是判断从1出发是否能到达n.初始 ...

  6. POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】

    题意: 给了n种硬币的名称,给了m种硬币间的转换关系. 从任意兑换地点开始兑换,看是否能够通过兑换的方式增加金钱. 思路: 用SPFA不断对各个点进行松弛操作,寻找正权值的环.如果找到则输出Yes. ...

  7. POJ 2240 Arbitrage (求负环)

    Arbitrage 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/I Description Arbitrage is the ...

  8. POJ 2240 Arbitrage spfa 判正环

    d[i]代表从起点出发可以获得最多的钱数,松弛是d[v]=r*d[u],求最长路,看有没有正环 然后这题输入有毒,千万别用cin 因为是大输入,组数比较多,然后找字符串用strcmp就好,千万不要用m ...

  9. USACO翻译:USACO 2014 JAN三题(2)

    USACO 2014 JAN 一.题目概览 中文题目名称 队伍平衡 滑雪录像 滑雪场建设 英文题目名称 bteams recording skicourse 可执行文件名 bteams recordi ...

随机推荐

  1. poj_3667线段树区间合并

    对照着notonlysuccess大牛的代码写的 #include<iostream> #include<cstdio> #include<cstring> #in ...

  2. django uWSGI nginx搭建一个web服务器 确定可用

    网上的找了很多篇 不知道为什么不行,于是自己搭建了一个可用的Web 大家可按步骤尝试 总结下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: .确保有一个能够用runserver ...

  3. Kali linux 2016.2(Rolling)里Metasploit的常用模块

    端口扫描 auxiliary/scanner/portscanscanner/portscan/ack ACK防火墙扫描scanner/portscan/ftpbounce FTP跳端口扫描scann ...

  4. tomcat到底是干什么用的?用大白话讲一下

    通俗点说他是jsp网站的服务器之一,就像asp网站要用到微软的IIS服务器,php网站用apache服务器一样,因为你的jsp动态网站使用脚本语言等写的,需要有服务器来解释你的语言吧,服务器就是这个功 ...

  5. CUDA笔记(十)

    下午仔细研究了两个程序,然后搜了一下解决方法 http://blog.sina.com.cn/s/blog_6de28fbd01011cru.html http://blog.csdn.net/che ...

  6. centOS7下 安装nodejs+nginx+mongodb+pm2部署vue项目

    一.购买服务器并远程连接 1.购买服务器和域名 可以选择阿里云或者是其他的厂商的服务器.然后会获得服务器ip地址,用户名和密码. 购买域名,将域名绑定到ip地址上. 2.下载xshell,winscp ...

  7. bzoj1051 [HAOI2006]受欢迎的牛 tarjan&&缩点

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

  8. [NOIP2009提高组]靶形数独

    题目:洛谷P1074.Vijos P1755.codevs1174. 题目大意:给你一个数独,让你填完这个数独,并要求得分最大,问这个得分是多少(不能填完输出-1). 每个格子的得分是当前格子所填的数 ...

  9. linux虚拟机拓展大小

    http://blog.csdn.net/wutong_login/article/details/40147057?utm_source=tuicool http://www.linuxidc.co ...

  10. ArcGIS api for javascript——鼠标悬停时显示信息窗口

    描述 本例展示当用户在要素上悬停鼠标时如何显示InfoWindow.本例中,要素是查询USA州图层的QueryTask的查询结果.工作流程如下: 1.用户单击一个要素 2.要素是“加亮的”图形. 3. ...