首页 > 代码库 > POJ-2240 -Arbitrage(Bellman)
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。