货币套汇(图路径)

货币套汇(图路径)题目描述 套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币 例如 假定 1 美元可以买 0 7 英镑 1 英镑可以买 9 5 法郎 1 法郎可以买到 0 16 美元 通过货币兑换 一个商人可以从 1 美元开始买入 得到 0 7 9 5 0 16 1 064 美元 从而获得 6

大家好,我是讯享网,很高兴认识大家。

题目描述

提示:判断图上是否出现正环,即环上所有的边相乘大于1

输入

第一行:测试数据组数 每组测试数据格式为:
 第一行:正整数n (1< =n< =30),正整数m,分别表示n种货币和m种不同的货币兑换率。
 2~n+1行,n种货币的名称。
 n+2~n+m+1行,每行有3个数据项ci,rij 和cj ,表示货币ci 和cj的兑换率为 rij。

输出

样例输入

2
3 3
USDollar
BritishPound
FrenchFranc


讯享网

USDollar 0.5 BritishPound
BritishPound 10.0 FrenchFranc
FrenchFranc 0.21 USDollar

3 6
USDollar
BritishPound
FrenchFranc

USDollar 0.5 BritishPound
USDollar 4.9 FrenchFranc
BritishPound 10.0 FrenchFranc
BritishPound 1.99 USDollar
FrenchFranc 0.09 BritishPound
FrenchFranc 0.19 USDollar

样例输出

#include <iostream> #include <string> using namespace std; class Graph { 
    private: int vexnum; //顶点数 int arcnum; //边数 bool *visit; //访问数组 double **array; //邻接矩阵 string *vex; //边 int *road; //记录走过的路 int num; void DFS(int v) { 
    } int Index(string s) { 
    for (int i = 0; i < vexnum; i++) { 
    if (vex[i] == s) { 
    return i; } } return -1; } public: Graph() { 
    cin >> vexnum >> arcnum; vex = new string[vexnum]; visit = new bool[vexnum]; road = new int[vexnum]; array = new double *[vexnum]; for (int i = 0; i < vexnum; i++) { 
    cin >> vex[i]; array[i] = new double[vexnum]; visit[i] = 0; road[i] = 0; for (int j = 0; j < vexnum; j++) { 
    array[i][j] = 0; } } for (int i = 0; i < arcnum; i++) { 
    string str1, str2; double weight; cin >> str1 >> weight >> str2; int pos1 = Index(str1), pos2 = Index(str2); array[pos1][pos2] = weight; } } ~Graph() { 
    delete[] vex; delete[] road; delete[] visit; for (int i = 0; i < vexnum; i++) { 
    delete array[i]; } delete array; } void DFS(int v) { 
    visit[v] = true; road[num++] = v; //记录每一条经过的边,以便后面的计算 for (int i = 0; i < vexnum; i++) { 
    if (visit[i] == 0 && array[v][i] != 0) //若无访问且有边相接,继续遍历 { 
    DFS(i); } } } void DFS_Traverse() { 
    for (int i = 0; i < vexnum; i++) { 
    num = 0; DFS(i); for (int k = 0; k < num; k++) { 
    //判断与起点是否构成环,若构成环则进行计算操作 if (array[road[k]][i] != 0) { 
    double result = 1; for (int j = 0; j < k; j++) { 
    result *= array[road[j]][road[j + 1]]; //一直乘到最后一个点 } result *= array[road[k]][road[0]]; //最后从最后一个点回到起点,构成一个环,将其乘起来 if(result>1) { 
    cout<<"YES"<<endl; } } } } for(int i=0;i<vexnum;i++) { 
    visit[i]=0; road[i]=0; } cout<<"NO"<<endl; } }; int main() { 
    int t; cin>>t; while(t--) { 
    Graph G; G.DFS_Traverse(); } return 0; } 

讯享网
小讯
上一篇 2025-01-09 16:00
下一篇 2025-02-11 08:07

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/41306.html