汇率转换问题: 怎么样才能套利
可以用Floyd算法:
#include<bits/stdc++.h> using namespace std; double m1[35][35]; int main() { int n,m; map<string,int>ma;int cas=1; while(scanf("%d",&n)==1,n) { string ss; for(int i=1;i<=n;i++) { cin>>ss; ma[ss]=i; } string s1,s2;double rate; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j)m1[i][j]=1; else m1[i][j]=0; } scanf("%d",&m); for(int i=1;i<=m;i++) { cin>>s1>>rate>>s2; m1[ ma[s1] ][ ma[s2] ]=rate; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) { if(m1[j][k]<m1[j][i]*m1[i][k]) m1[j][k]=m1[j][i]*m1[i][k]; } int ok=0; for(int i=1;i<=n;i++) if(m1[i][i]>1){ok=1;break;} printf("Case %d: %s ",cas++,ok?"Yes":"No"); } return 0; }
string用cin输入 cin和scanf都会自动略过空格和空行
spfa算法
#include <stdio.h> #include <iostream> #include <cstring> #include <map> #include <queue> #include <algorithm> using namespace std; const int L = 35; const double inf = 1000000; map<string,int> mat; int n,m; char str[105],s1[105],s2[105]; double trip[35][35],dis[35]; int SPFA(int src) { queue<int> Q; int vis[35],i; int num[35]; for(i = 1; i<=n; i++) vis[i] = dis[i] = num[i] = 0; while(!Q.empty()) Q.pop(); dis[src] = 1.0; vis[src] = 1; Q.push(src); while(!Q.empty()) { int now = Q.front(); Q.pop(); vis[now] = 0; for(i = 1; i<=n; i++) { if(dis[now]*trip[now][i]>dis[i]) { dis[i] = dis[now]*trip[now][i]; if(dis[src]>1.0) return 1; if(!vis[i]) { vis[i] = 1; Q.push(i); } } } } return 0; } int main() { int i,j,cas = 1; double w; while(~scanf("%d",&n),n) { mat.clear(); for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) trip[i][j] = (i==j)?1.0:0; for(i = 1; i<=n; i++) { scanf("%s",str); mat[str] = i; } scanf("%d",&m); while(m--) { scanf("%s%lf%s",s1,&w,s2); trip[mat[s1]][mat[s2]] = w; } int flag = 0; for(i = 1; i<=n; i++) { if(SPFA(i)) { flag = 1; break; } } printf("Case %d: %s ",cas++,flag?"Yes":"No"); } return 0; }