题目链接:http://poj.org/problem?id=2240、
Floyd算法修改一下,我要最大路径(通过转汇率变到最大)改成max.
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> using namespace std; double dis[50][50]; int n; int main() { int cases = 1; while(scanf("%d",&n),n) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i==j) dis[i][j] = 1; else dis[i][j] = 0; char s[50][50],a[50],b[50]; for(int i=1;i<=n;i++) scanf("%s",s[i]); int m; double t; scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%s %lf %s",a,&t,b); int j,k; for(j=1;j<=n;j++) if(strcmp(s[j],a)==0) break; for(k=1;k<=n;k++) if(strcmp(s[k],b)==0) break; dis[j][k] = t; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j] = max(dis[i][j],dis[i][k]*dis[k][j]); bool flag = false; for(int i=1;i<=n;i++) if(dis[i][i]>1) { flag = true; break; } if(flag) printf("Case %d: Yes\n",cases++); else printf("Case %d: No\n",cases++); } return 0; }