104

#include <iostream>

#define FOR(i,n)  for(int i=1;i<=n;i++)

double gr[22][22][22];
int nxt[22][22][22];
int backtrck[22];
int n;
using namespace std;

int path(int step,int i,int j)
{
	backtrck[step] = j;
	step-=1;
	while(step)
	{
		backtrck[step]=nxt[step][i][j];
		step-=1;
		j= nxt[step][i][j];
	}
	backtrck[step]=nxt[step+1][i][j];
	return 0;
}


void init()
{
	FOR(step,n)
		FOR(i,n)
			FOR(j,n)
			{
				nxt[1][i][j]=i;
				gr[step][i][j]=0;
			}
}

int main()
{

	while(cin>>n)
	{
		init();

		FOR(i,n)
		{
			FOR(j,n)
			{
				if(i==j)
				{
					gr[1][i][j]=1;
					continue;
				}
				else
				cin>>gr[1][i][j];
			}
		}

		for(int step=2;step<=n;step++)
		FOR(k,n)
		{
			FOR(i,n)
			{
				FOR(j,n)
				{
					double tmp = gr[step-1][i][k]*gr[1][k][j];
					if(tmp>gr[step][i][j])
					{
						gr[step][i][j] = tmp;
						nxt[step][i][j] = k;
					}
				}
			}
		}

		int f=0;
		int targetNo;
		for(int step=2;step<=n;step++)
		{
			for(int i=1;i<=n;i++)
			{
				if(gr[step][i][i]>1.01)
				{
					f=step;
					targetNo=i;
					break;
				}
			}
			if(f)
			break;
		}
		//cout<<"f = "<<f<<"\n";

		if(!f)
		{
			cout<<"no arbitrage sequence exists\n";
			continue;
		}

		else {
             int index=0;

             int currentNo = targetNo;
             backtrck[index++] = targetNo;
             for(int s=f; s>=1; s--) { //path from targetNo to currentNo
                 currentNo = nxt[s][targetNo][currentNo];
                 backtrck[index++] = currentNo;
             }
             for(int i=index-1; i>0; i--)
                 cout<< backtrck[i]<<" ";
             cout<<backtrck[0]<<"\n";
		 }

		//for(int i=0;i<=f;i++)
		//cout<<backtrck[i]<<(i!=f?" ":"\n");


	}

	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *