POJ 2240 Arbitrage
这个题也是十分水的题,节点最多只有30个。
Floyd就可以过的哈。
需要注意的是:
1、不要用gets(),因为中间有空行;
2、注意输出的是Yes,No。
下面是代码:
#include <stdio.h> #include <string.h> const int inf=1<<30; const int V=105; int n; double map1[V][V]; char s[35][200]; int find1() { char s1[200]; scanf("%s",s1); for(int i=0; i<n; i++) { if(strcmp(s[i],s1)==0) { return i; } } } void flody(int n) { int i,j,k; for(k=0; k<n; k++) { for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(map1[i][j]<map1[i][k]*map1[k][j]) { map1[i][j]=map1[i][k]*map1[k][j]; } } } } } int main() { int in=1; while(scanf("%d",&n),n) { int i,j,t,a,b,flat=0; double d; for(i=0; i<n; i++) { scanf("%s",s[i]); } scanf("%d",&t); for(i=0;i<n;i++) { for(j=0;j<n;j++) { map1[i][j]=1.0; } } for(i=0; i<t; i++) { a=find1(); scanf("%lf",&d); b=find1(); map1[a][b]=d; } flody(n); for(i=0;i<n;i++) { if(map1[i][i]>1.0) //判断条件 { flat=1; } } if(flat) { printf("Case %d: Yes\n",in); } else { printf("Case %d: No\n",in); } in++; } return 0; }