POJ-2240 -Arbitrage(Bellman)
Posted clnchanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-2240 -Arbitrage(Bellman)相关的知识,希望对你有一定的参考价值。
题目链接:Arbitrage
让这题坑了,精度损失的厉害。用赋值的话。直接所有变成0.00了,无奈下,我仅仅好往里输了,和POJ1860一样找正环,代码也差点儿相同,略微改改就能够了,可是这个题精度损失的比那个。
。。。
水过
POJ计划的最短路模块,刷完了,最短路问题,挺坑的,可是就是那点东西,变来变去,就是改改dis[]的更新条件。
明天就要開始POJ的最小生成树了,
ME TI
704Kb 46Ms
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 50; const int M = 1010; char a[N][N],s[N]; double dis[N]; int n,m,num; struct node{ int u,v; double w; }edge[M]; int Bellman(int x) { dis[x] = 1.0;//開始时漏了,结果都打NO for(int i = 0;i <n;i++) { for(int j = 0;j < num; j++) { if(dis[edge[j].v] < dis[edge[j].u] * edge[j].w) dis[edge[j].v] = dis[edge[j].u] * edge[j].w; } } for(int i = 0;i<num;i++) { if(dis[edge[i].v] < dis[edge[i].u]*edge[i].w) return 1; } return 0; } int main() { int c; c = 0; while(scanf("%d",&n),n) { c++; for(int i = 0;i <n;i++) dis[i] = 0; for(int i = 0;i <n;i ++) scanf("%s",a[i]); scanf("%d",&m); num = 0; while(m--) { scanf("%s",s); for(int i = 0;i <n;i++) { if(strcmp(s,a[i])== 0) { edge[num].u = i; break; } } scanf("%lf",&edge[num].w); scanf("%s",s); for(int i = 0;i <n;i++) { if(strcmp(s,a[i]) == 0) { edge[num++].v = i; break; } } } int st; for(int i = 0;i<n;i++)//挨个枚举,找正环 { st = Bellman(i); if(st) break; } printf("Case %d: ",c); if(st) puts("Yes"); else puts("No"); } return 0; }
以上是关于POJ-2240 -Arbitrage(Bellman)的主要内容,如果未能解决你的问题,请参考以下文章