POJ2240---Arbitrage(最短路:验证是否正环)
来源:互联网 发布:java手游 编辑:程序博客网 时间:2024/05/17 22:38
【题目来源】:https://vjudge.net/problem/POJ-2240
【题意】
给出多种国家的货币,问,存不存在任意一种货币经过转换成别国货币,钱数增多的。。。
【思路】
前天做过一题,相同类型,Currency Exchange,这道题就是验证存不存在正环,而前天那道题是给出了起初是哪一种货币,而这道题并没有,所以,如果继续用bellman的话,就要for循环节点。
但是这道题还可以用floyed去做,想一下,既然,点和点既然有直接或者间接的关系,那么一定可以通过其他中间点连接。也就是floyed的三层for,最外层的循环代表循环前k个点连接的i与j。(也就是一个dp的过程)(这是我对floyed的理解,,如果错了,欢迎指正)
【代码1】
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,m,k,cases;double d[35];char s[35][20];struct djh{ int u,v; double po;} edge[1000];bool bellman(int v){ memset(d,0,sizeof(d)); d[v]=1.0; for(int i=1; i<=n; i++) for(int j=0; j<k; j++) if(d[edge[j].v]<d[edge[j].u]*edge[j].po) d[edge[j].v]=d[edge[j].u]*edge[j].po; if(d[v]>1) return 1; else return 0;}int main(){ cases=1; while(~scanf("%d",&n)&&n) { for(int i=1; i<=n; i++) scanf("%s",s[i]); scanf("%d",&m); k=0; for(int i=0; i<m; i++) { char t1[20],t2[20]; scanf("%s %lf %s",t1,&edge[k].po,t2); for(int j=1; j<=n; j++) if(strcmp(s[j],t1)==0) { edge[k].u=j; break; } for(int j=1; j<=n; j++) if(strcmp(s[j],t2)==0) { edge[k++].v=j; break; } } bool flag=0; for(int i=1; i<=n; i++)//多次bellman,找出符合结果 if(bellman(i)) { flag=1; break; } flag?printf("Case %d: Yes\n",cases++):printf("Case %d: No\n",cases++); }}
【代码2】
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,m,cases;double d[35][35];char s[35][25];void init(){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=i==j?1.0:0.0;}void floyed(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(d[i][j]<d[i][k]*d[k][j]) d[i][j]=d[i][k]*d[k][j];}int main(){ cases=1; while(~scanf("%d",&n)&&n) { for(int i=1; i<=n; i++) scanf("%s",s[i]); scanf("%d",&m); init(); for(int i=0; i<m; i++) { double c; char t1[20],t2[20]; scanf("%s %lf %s",t1,&c,t2); int a,b; for(int j=1; j<=n; j++) if(strcmp(s[j],t1)==0) { a=j; break; } for(int j=1; j<=n; j++) if(strcmp(s[j],t2)==0) { b=j; break; } d[a][b]=c; } floyed(); bool flag=0; for(int i=1; i<=n; i++) if(d[i][i]>1) { flag=1; break; } flag?printf("Case %d: Yes\n",cases++):printf("Case %d: No\n",cases++); }}
哦,对了,两个代码都是47ms、、、、
阅读全文
0 0
- POJ2240---Arbitrage(最短路:验证是否正环)
- POJ2240 Arbitrage(最短路)
- POJ2240 Arbitrage 最短路 bellmanford
- poj2240(Floyd最短路的变种---最长路 )Arbitrage
- 【POJ2240】Arbitrage 比值最短路 (货币兑换问题)
- hdu 1217 && poj2240 Arbitrage 最短路
- POJ2240 Arbitrage BellmaFord判最短路回路
- POJ 2240Arbitrage 最短路正环存在问题
- 【动态规划DP,floyd最短路】poj2240,Arbitrage
- POJ1860---Currency Exchange (最短路:验证是否存在正环)
- 1217 Arbitrage(最短路)
- 最短路练习9/poj/2240 Arbitrage;正环:floyd或spfa解法;
- poj2240 Arbitrage (spfa判环)
- POJ2240 Arbitrage(floyd找正环)
- POJ2240 Arbitrage(最短路径:SPFA||Floyd)
- HDU 1217 Arbitrage(最短路判断负环)
- POJ2240:Arbitrage
- poj2240 Arbitrage
- MaterialDialog无法设置字体颜色
- 编码读取EXCEL的几点注意
- Android线程管理(一)——线程通信(转载)
- Kaldi语音识别学习笔记(一)
- 页面去掉横竖滚动条
- POJ2240---Arbitrage(最短路:验证是否正环)
- 怎么样学习思维导图
- JavaScript OOP 之「创建对象」
- 安装kaldi-GridEngine
- 智能一代云平台(三十一):mybatis加入分页
- CSS学习笔记--布局
- BZOJ4554(Tjoi2016&Heoi2016)[游戏]--二分图最大匹配
- OV7725的帧率和PCLK寄存器设置
- 51nod1160 压缩算法的矩阵