POJ2240-Arbitrage
http://poj.org/problem?id=2240
之前看了红皮写的
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN=50; const int MAXL=1005; char str[MAXN][MAXL],strA[MAXL],strB[MAXL]; long double dist[MAXN][MAXN]; int N,M; int find(char *_str) { for(int i=1;i<=N;i++) if(strlen(_str)==strlen(str[i])&&strcmp(_str,str[i])==0) return i; return 0; } int main(void) { int i,j,k; while(scanf("%d",&N)&&N) { static int cnt=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) dist[i][j]=0; for(i=1;i<=N;i++) scanf("%s",str[i]); scanf("%d",&M); for(i=1;i<=M;i++) { double w; scanf("%s%lf%s",strA,&w,strB); dist[find(strA)][find(strB)]=w; } for(k=1;k<=N;k++) for(i=1;i<=N;i++) for(j=1;j<=N;j++) if(i!=j&&j!=k&&k!=i) if(dist[i][k]*dist[k][j]>dist[i][j]) dist[i][j]=dist[i][k]*dist[k][j]; bool flag=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) if(dist[i][j]*dist[j][i]>1) flag=1; printf("Case %d: %s\n",++cnt,flag?"Yes":"No"); } return 0; }