Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 12809 | Accepted: 5414 |
Description
Input
Output
Sample Input
3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
Sample Output
Case 1: Yes Case 2: No
这是一道bf的模板题,
首先是bf,代码如下:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define maxn 50 #define maxm 1000 #define max(a,b) (a>b?a:b) using namespace std; struct exchange{ int ci,cj; double cij; }ex[maxm]; int i,j,k; int n,m; char name[maxn][20],a[20],b[20]; double x; double maxdist[maxn]; int flag; int caseno=0; int read(){ scanf("%d",&n); if(n==0) return 0; for(i=0;i<n;i++) scanf("%s",name[i]); scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%s %lf %s",a,&x,b); for(j=0;strcmp(a,name[j]);j++) ; for(k=0;strcmp(b,name[k]);k++) ; ex[i].ci=j; ex[i].cij=x; ex[i].cj=k; } return 1; } void Bellman_Ford(int v0){ flag=0; memset(maxdist,0,sizeof(maxdist)); maxdist[v0]=1; for(k=1;k<=n;k++) for(i=0;i<m;i++){ if(maxdist[ex[i].ci]*ex[i].cij>maxdist[ex[i].cj]) maxdist[ex[i].cj]=maxdist[ex[i].ci]*ex[i].cij; } if(maxdist[v0]>1.0) flag=1; } int main(){ while(read()){ for(i=0;i<n;i++){ Bellman_Ford(i); if(flag) break; } if(flag) printf("Case %d: Yes\n",++caseno); else printf("Case %d: No\n",++caseno); } return 0; }
据说用floyd是可以做的,我写了这个floyd,但是tle,实在想不到什么好的优化方法了,恳请大神斧正:下面是代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,m,x,y; char name[32][100],temp1[100],temp2[100]; double map[32][32],price; int flag,success,caseno=1; int i,j,k; int main(){ while(scanf("%d",&n)&&n){ for(i=1;i<=n;i++){ scanf("%s",name[i]); } scanf("%d",&m); success=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ map[i][j]=0.0; } map[i][i]=1.0; while(m--){ flag=0; scanf("%s%lf%s",temp1,&price,temp2); for(i=1;i<=n&&flag!=2;i++){ if(strcmp(temp1,name[i])==0){ x=i; flag++; } if(strcmp(temp2,name[i])==0){ y=i; flag++; } } map[x][y]=price; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++){ map[i][j]=max(map[i][j],(map[i][k]*map[k][j])); } for(k=1;k<=n;k++){ if(map[k][k]>1){ success=1; break; } } } if(success==0){ printf("Case %d: NO\n",caseno++); } else{ printf("Case %d: Yes\n",caseno++); } } return 0; }