#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int MAX = 10;
string name[MAX];
double r[MAX][MAX]; //r[i][j]表示货币i与货币j的兑换率
double max(double a, double b)
{
return a>b ? a:b;
}
//通过计算兑换率矩阵的传递闭包进行判断
//n为货币种数, m为兑换率种数
//如果存在套汇,返回"yes",否则返回"no"
string greedy(int n)
{
int i, j, k;
for(i=0; i<n; i++)
r[i][i] = 1.0;
for(k=0; k<n; k++)
for(i=0; i<n; i++)
for(j=0; j<n; j++)
r[i][j] = max(r[i][j], r[i][k]*r[k][j]);
for(i=0; i<n; i++)
if(r[i][i] > 1.0)
return "yes";
return "no";
}
int main()
{
ifstream fin("套汇.txt");
int n, m;
int count = 0;
while(!fin.eof())
{
count++;
cout << "输入货币总数:";
fin >> n; cout << n;
cout << "\n输入货币名称:\n";
int i;
for(i=0; i<n; i++)
{
fin >> name[i]; cout << name[i] << endl;
}
cout << "输入不同货币兑换率种数:";
fin >> m; cout << m;
cout << "\n货币ci,兑换率rij,货币cj:\n";
string c1, c2;
double r12;
for(i=0; i<m; i++)
{
fin >> c1; cout << c1 << " ";
fin >> r12; cout << r12 << " ";
fin >> c2; cout << c2 << endl;
for(int j=0; j<n && c1.compare(name[j])!=0; j++);
for(int k=0; k<n && c2.compare(name[k])!=0; k++);
r[j][k] = r12;
}
cout << "case " << count << " " << greedy(n) << endl;
}
fin.close();
return 0;
}
套汇问题
最新推荐文章于 2023-08-28 22:58:29 发布