uva 104 - Arbitrage

//开始用的隐式图搜索,结果超内存,铭记自己做题之前不计算时间,内存限制的怪毛病

//首先说明这道题可以使用动规,它的难点在于如何输出最短的交换方式,这种轻快下就要加一维,标记[step]

//然后floyd+动规吧,o(n4) is enough

 

 

 

#include <iostream> #include <memory.h> #include <cstdio> #include <stack> using namespace std; const int MAX=25; const double E=1e-9,sta=1.01; bool findFlag; int n,sign,totalStep; double map[MAX][MAX][MAX],way[MAX][MAX][MAX]; stack<int> s; inline int dbCmp(const double & x){ if(x>-E&&x<E) return 0; return x>0?1:-1; } int main() { freopen("i.txt","r",stdin); int k; while(cin>>n){ memset(way,0,sizeof(way)); memset(map,0,sizeof(map)); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j){ map[i][j][1]=1.0; way[i][j][1]=i; continue; } cin>>map[i][j][1]; way[i][j][1]=i; } } findFlag=0; for(int step=2;step<=n;step++){ for(k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(map[i][j][step]<map[i][k][step-1]*map[k][j][1]){ map[i][j][step]=map[i][k][step-1]*map[k][j][1]; way[i][j][step]=k; } if(i==j) if(dbCmp(map[i][j][step]-sta)==1){ findFlag=1; sign=j; totalStep=step; goto ans; } } } } } ans: if(findFlag){ while(!s.empty()) s.pop(); int end=sign; s.push(sign); for(int i=totalStep;i>=2;end=way[sign][end][i],i--) s.push(way[sign][end][i]); cout<<way[sign][end][1]; while(!s.empty()){ cout<<" "<<s.top(); s.pop(); } cout<<endl; } else cout<<"no arbitrage sequence exists"<<endl; /*for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<map[i][j]<<" "; } cout<<endl; }*/ } return 0; }

你可能感兴趣的:(uva 104 - Arbitrage)