一个关于套利的题,就是判断是否有正环,我这里是用的SPFA,只要判断出来一种货币初始为1,最后变得大于1就代表是正环,要注意一下最后对vector的清空,当时从1开始清空,导致wa了两次,找了半天,尽量不要出现小的错误还是很致命的
#include <iostream> #include<string.h> #include <cstdio> #include <queue> #include <vector> using namespace std; #define MAX 99999999; double dis[100+6]; double vis[100+6]; int time[100+6]; int n; char name[50][100]; double fir; typedef struct { int x; double rate; //double cost; }point; int judge_name( char* str) { for(int i=0;i<n;i++) { if(strcmp(str,name[i])==0) return i; } } vector<point> p[101]; int Spfa(int start) { queue<int> Q; memset(time,0,sizeof(time)); memset(vis, 0, sizeof(vis)); memset(dis, 0, sizeof(dis)); dis[start] = 1.0; vis[start] = true; time[start]++; Q.push(start); while (!Q.empty()){ int temp = Q.front(); Q.pop(); vis[temp] = false; for(int i=0; i<p[temp].size(); i++) { int v=p[temp][i].x; double w=p[temp][i].rate; if (dis[v] <dis[temp]*w) { dis[v] = dis[temp]*w; if(dis[start]>1.0) { // cout<<start<<endl; // cout<<dis[start]<<endl;; return true; } if (!vis[v]) { Q.push(v); vis[v] = true; } } } } return false; } int main() { int m,s; int total=0; while(cin>>n,n) { for(int i=0;i<n;i++) cin>>name[i]; int m; cin>>m; char str1[100],str2[100]; double f; point node; for(int i=0;i<m;i++) { cin>>str1>>f>>str2; node.x=judge_name(str2); node.rate=f; p[judge_name(str1)].push_back(node); } int flag=0; for(int i=0;i<n;i++) { if(Spfa(i)) { flag=true; break; } } if(flag) printf("Case %d: Yes ",++total); else printf("Case %d: No ",++total); for(int i=0;i<n;i++) p[i].clear(); } return 0; }