最短路中汇率问题 POJ 1860 与 POJ 2240
来源:互联网 发布:无间道歌曲 知乎 编辑:程序博客网 时间:2024/05/10 16:13
http://poj.org/problem?id=1860
题目大意:给你一系列货币之间的汇率,有人持有一种货币,经过多次交换后能不能得到更多的钱,这个可以用spfa做,但是我还是用dijkstra做的,用了spfa的一点思想:当一个点被更新后,它要放入能更新周围点的这个队列中
#include<stdio.h>#include<string.h>float r[1000][1000],c[1000][1000],f[1000];int k[1000];int main(){int N,M,S; float t;scanf("%d%d%d%f",&N,&M,&S,&t); int i; for(i=1;i<=N;i++) f[i]=0; f[S]=t; memset(r,0,sizeof(r)); memset(c,0,sizeof(c)); for(i=1;i<=M;i++) { int a,b; scanf("%d%d",&a,&b); scanf("%f%f%f%f",&r[a][b],&c[a][b],&r[b][a],&c[b][a]); } memset(k,0,sizeof(k)); while(1)//dijkstra部分 { int judge=-1; for(i=1;i<=N;i++) if(k[i]==0) { if(judge==-1||f[judge]<f[i]) judge=i; } if(judge==-1) break; k[judge]=1; for(i=1;i<=N;i++) { if(r[judge][i]>0&&(f[judge]-c[judge][i])*r[judge][i]>f[i]) { f[i]=(f[judge]-c[judge][i])*r[judge][i]; k[i]=0;//就是这里,如果它被更新了,从删除状态恢复,下次继续更新周围的点 } } if(f[S]>t)//如果s点大于之前的值,直接break; break; } if(f[S]>t) printf("YES\n"); else printf("NO\n"); return 0;}
http://poj.org/problem?id=2240
跟上面的一个意思,只不过输入的字符串所代表的的货币你要自己一个个来构图,别的就没什么了
#include<stdio.h>#include<string.h>char str1[1000][1000], str2[2000][1000],str3[2000][1000];//这边要数组开的很大才能过,不知道为什么,我的小伙伴们开的很小就过了,如果有人能告诉我原因,我会感激涕零的,诶、、、、、、说多了都是泪啊!!!!float d[1000][1000],f[1000];int k[100];int main(){int n,m,cases=0;while(scanf("%d",&n)!=EOF&&n!=0){int i,j; memset(d,0,sizeof(d));for(i=1;i<=n;i++){getchar();scanf("%s",str1[i]);}for(i=1;i<=n;i++)d[i][i]=1;scanf("%d",&m);for(i=1;i<=m;i++){int a,b;float t; getchar(); scanf("%s%f%s",str2[i],&t,str3[i]); for(j=1;j<=n;j++) {if(strcmp(str2[i],str1[j])==0) a=j; if(strcmp(str3[i],str1[j])==0) b=j; } d[a][b]=t;// printf("%f ",d[a][b]);} memset(k,0,sizeof(k)); for(i=2;i<=n;i++) f[i]=0; f[1]=1; // printf("sdfg\n");while(1){int judge=-1;for(i=1;i<=n;i++)if(k[i]==0){if(judge==-1||f[judge]<f[i])judge=i;}k[judge]=1;if(judge==-1)break; for(i=1;i<=n;i++){if(d[judge][i]>0&&f[i]<d[judge][i]*f[judge]){f[i]=d[judge][i]*f[judge];k[i]=0;}}if(f[1]>1)break;//printf("df\n");}cases++;//for(i=2;i<=n;i++)//if(f[i]*d[i][1]>1)if(f[1]>1)printf("Case %d: Yes\n",cases);//if(i==n+1)elseprintf("Case %d: No\n",cases);}return 0;}
- 最短路中汇率问题 POJ 1860 与 POJ 2240
- POJ 2240 最短路
- poj 2240 最短路
- poj 1860 最短路
- POJ 1860 最短路
- poj 3463 最短路与次短路
- poj 2240 Arbitrage 最短路
- POJ 2240 Arbitrage(最短路)
- POJ-2240 Arbitrage(最短路)
- poj 1860(最短路)
- POJ-1860(最短路)
- POJ中最短路问题汇总【转】
- poj 2253 最短路
- POJ 1135 最短路
- POJ 2267 最短路
- POJ 1797 最短路
- poj 1135最短路
- poj 1122最短路
- Direct Memory
- 一个操作系统的实现(5):中断门
- 共享池的调整与优化(Shared pool Tuning)
- 十进制转二进制
- STL set
- 最短路中汇率问题 POJ 1860 与 POJ 2240
- maven 中的依赖范围与classpath的关系
- linux mmap 内存映射
- 育儿经
- 让元素在网页中可拖动
- nio高并发编程
- 贝尔数,分拆
- 题目1:找出1000以下自然数中3和5的倍数之和
- Linux下快速扩展文件大小