这题感觉有点小难(估计还是我太菜

题目描述
套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币。例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5 法郎,1法郎可以买到0.16美元。通过货币兑换,一个商人可以从1 美元开始买入,得到0.7×9.5×0.16=1.064美元,从而获得6.4%的利润。 给定n种货币c1 ,c2 ,… ,cn的有关兑换率,试设计一个有效算法,确定货币间是否存在套汇的可能性。
提示:判断图上是否出现正环,即环上所有的边相乘大于1
输入
第一行:测试数据组数
每组测试数据格式为:
第一行:正整数n (1< =n< =30),正整数m,分别表示n种货币和m种不同的货币兑换率。
2~n+1行,n种货币的名称。
n+2~n+m+1行,每行有3 个数据项ci,rij 和cj ,表示货币ci 和cj的兑换率为 rij。
输出
对每组测试数据,如果存在套汇的可能则输出YES
如果不存在套汇的可能,则输出NO。
样例输入
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
样例输出
YES
NO

思路就是先将输入转化为邻接矩阵(构造函数做的事情),然后在对每一个顶点进行深度优先搜索的的时候加入一个road数组,储存经过的路径,如果路上的其中的某个顶点与起点有路径,则说明形成了回路,那么此时判断这个回路上所有的点乘积是否大于一即可。
注意,需要对每个顶点的每个road上的每个点,都需要判断其与顶点间是否形成了回路,若形成则计算乘积。

#include <iostream>using namespace std;int findIndex(string huobi[],int length,string a){for(int i=0;i<length;i++){if(huobi[i]==a){return i;}}return -1;
}
class Map{int len; //顶点数int *v;  //访问标识数组double **Matrix; //邻接矩阵int num;int *road;string *huobi;
public:Map(){//创建图时根据输入的信息把邻接矩阵输入好cin>>len;num=0;road=new int[len];v=new int[len];for(int i=0;i<len;i++){v[i]=0;road[i]=0;}Matrix=new double*[len];for(int i=0;i<len;i++)Matrix[i]=new double[len];int num;cin>>num;huobi=new string[len];for(int i=0;i<len;i++){for(int j=0;j<len;j++){Matrix[i][j]=0;if(i==j)Matrix[i][j]=1;}}for(int i=0;i<len;i++){cin>>huobi[i];}for(int i=0;i<num/len;i++){for(int j=0;j<len;j++){string huobi1,huobi2;double huilv0;cin>>huobi1>>huilv0>>huobi2;int index1=findIndex(huobi,len,huobi1);int index2=findIndex(huobi,len,huobi2);Matrix[index1][index2]=huilv0;}}/*for(int i=0;i<len;i++){for(int j=0;j<len;j++){cout<<Matrix[i][j]<<" ";}cout<<endl;}*/}void dfs(int k){//cout<<k<<" ";v[k]=1;road[num]=k;num++;for(int i=0;i<len;i++){if(v[i]==0&&Matrix[k][i]!=0){dfs(i);}}}void DFSTraverse(){for(int i=0;i<len;i++){//对所有顶点进行循环num=0;dfs(i);for(int k=1;k<num;k++){//k代表的是从起点往下走k个点if(Matrix[road[k]][i]!=0){//然后判断从第k个点到起点是否有路,如果有路就代表形成了回环//因为road[k]是从起点走到第k个点了,只需要和起点有路说明形成了回路float result=1;int j;for(j=0;j<k;j++){result*=Matrix[road[j]][road[j+1]];//接下来从起点乘到最后一个点}result*=Matrix[road[j]][road[0]];//最后再从最后一个点回到原点,将其乘积乘起来if(result>1){cout<< "YES"<<endl;return;}}}for(int i=0;i<len;i++){v[i]=0;road[i]=0;}}cout<<"NO"<<endl;return;}};int main()
{int t;cin>>t;while(t--){Map map;map.DFSTraverse();}return 0;
}

货币套汇(图路径)【数据结构-深度优先搜索-回路】相关推荐

  1. 图的遍历——深度优先搜索+广度优先搜索

    一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...

  2. 图:BFS(深度优先搜索)图解分析代码实现

    文章目录 一.介绍 二.图的建立 2.1建立图类 2.2建立图 三.BFS 3.1图解: 3.2代码 四.DFS和BFS完整代码 一.介绍 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种 ...

  3. 图:DFS(深度优先搜索)图解分析代码实现

    文章目录 一.简介 二.图的建立 2.1建立图类 2.2建立图 三.DFS 3.1图解 3.2代码 一.简介 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种遍历方式. 主要区别在于当到达 ...

  4. 图遍历之深度优先搜索

    一 概述 深度优先搜索(Depth-First-Search,DFS)类似于树的先序遍历.它遵循的搜索策略是尽可能"深"地搜索一个图. 二 深度优先搜索的基本思想 首先访问图中某一 ...

  5. 数据结构深度优先搜索c语言,C语言数据结构与算法之深度、广度优先搜索

    一.深度优先搜索(Depth-First-Search 简称:DFS) 1.1 遍历过程: (1)从图中某个顶点v出发,访问v. (2)找出刚才第一个被顶点访问的邻接点.访问该顶点.以这个顶点为新的顶 ...

  6. 图的遍历——深度优先搜索和广度(宽度)优先搜索(含例题)

    专栏导读及目录https://blog.csdn.net/createprogram/article/details/86741044 深度优先搜索 DFS基本思想 基本步骤: 1.从图中某个顶点v0 ...

  7. 332. 重新安排行程(图,dfs(深度优先搜索))

    原文链接:https://leetcode-cn.com/problems/reconstruct-itinerary/solution/332-zhong-xin-an-pai-xing-cheng ...

  8. 图的深度搜索c语言,求图的深度优先搜索!该怎么处理

    当前位置:我的异常网» C语言 » 求图的深度优先搜索!该怎么处理 求图的深度优先搜索!该怎么处理 www.myexceptions.net  网友分享于:2013-03-16  浏览:12次 求图的 ...

  9. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

最新文章

  1. Redis Sentinel 服务端实现原理
  2. Spark2.2.0分布式集群安装(StandAlone模式)
  3. 如何使用窗体开发-理解那些函数怎么来的?
  4. Python3快速入门(五)——Python3函数
  5. 神策数据受邀参加全国 APP 个人信息保护监管会
  6. html5表单新增的输入类型,HTML5之表单新增类型介绍
  7. php判断对象属于哪个类,PHP instanceof:判断对象是否属于某个类
  8. killall命令_没想到Linux命令也有“吓人”的一面……
  9. 小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_12、SpringBoot2.x文件上传实战...
  10. 计算机--学习笔记(1)
  11. 桥接、交换机、路由器、网桥、网关
  12. 绩效考核方法:绩效目标怎么确定_做到商学院
  13. 信息收集之 绕过CDN获取真实IP地址
  14. Mysql主从备份数据库服务器搭建
  15. 回顾 12 个面向 Web 开发人员的在线代码编辑器
  16. 市场调研报告-全球与中国教育互动白板市场现状及未来发展趋势
  17. wxPython使用EVT_MENU_OPEN事件实现运行时生成动态菜单
  18. Delphi Bpl包学习
  19. uniapp热更新报错安装失败[-1201]:WGT/WGTU文件格式错误?
  20. PAT A1119 Pre- and Post-order Traversals

热门文章

  1. JST日本压着端子VH系列线对板连接器的PCB封装库
  2. 大学计算机制作九九乘法表,如何利用excel制作九九乘法表-excel制作九九乘法表的方法 - 河东软件园...
  3. 女友问粉丝过万如何庆祝,我发长文《保姆级大数据入门篇》感恩粉丝们支持,学姐|学弟看了就懂
  4. 文字到底应该如何雕琢
  5. 使用python中openpyxl模块操作excel文件,计算单元格分子式的相对分子质量(一)
  6. iheartradio android,最牛电台iHeartRadio
  7. bios uefi_什么是UEFI,它与BIOS有何不同?
  8. 电脑风扇,电脑风扇太吵如何解决 电脑风扇太吵解决方法【详解】
  9. leo-超易用的计件工资管理系统
  10. 【听】跟任何人都聊得来,如何打破沟通障碍