最近在做的一道图形搜索题

最近在备考软考高级-项目管理工程师,在管理科学章节有一题是这样的

问:至少要多长的线路,才能保持6个城市的通信联通

首先搞清楚:什么是互通

图中一共有6个点,互通是指一个点可以到任何的其它5个点,如果一个图是互通的,那么所有点到其它任何点都可达,换句话说,可以以A点为准,看A到其它的点是否互通

第一次做这种题,有点不知道如何下手,先听老师讲,老师讲的思路是把这些路径从短到长依次排个序,然后依次取出来,看有没有互通

最后的结果是这样,最短是200+200+300+300+300=1000

做题的话,也要写过程, 按照老师提供的思路可行,但最后的路线图可能不止这一种,然后我就想着看用代码能实现不,接着就开干。

按照老师的思路,首先定义节点,节点的可达节点用list表示

可达节点。记录当前节点信息和下一节点GraphicsNode对象,length表示当前节点到下一节点的长度

 具体实现

1.初始化图形,这一步不是重点。以特定方式表示并按这种方式解析字符串。

2.如上所述,以A点为准,看A到其它的点是否互通,就要取出A点和其它的点,或者换句话说,输入的第一点,也认为是头节点

3.将路径从短到长排序,得到有效不重复路径集合。A到B认为有效,B到A认为重复。

4.判断A节点到其它节点是否可达

思路是先看这个节点是不是这个头节点的直接可达节点

如果是 返回;如果不是,再看头节点的可达节点的可达节点是否到这个节点可达

比如说A到B,直接可达,A到D要先A到F,F再到D

 5.寻找最短路径,依次取出3步骤中的路线集合,每取出一个,看A到其它所有节点是否可达

结果输出是

AE 
FD 
AB 
AF 
BF 
CD 

就发现其实BF多了。有点问题

思考与讨论:

1.这是图形搜索类题目吗,如果是,是深度搜索还是广度搜索

我觉得应该算是的,应该算是深度搜索吧,广度搜索是更大范围内搜索 ,但这里是找最短,是小范围搜索,互通了截至,和一直找直到走不通概念类似。

2.还有其它实现吗

应该是有的,比如穷举法,穷举出所有可以互通的所有路径,再找哪个最少。但怎么看都应该是目前的思路最佳,因为本来就是要找最短路径,那先把路径按顺序排好,再依次取出。

3.为什么现在的实现存在问题

第一个:BF多出来的问题

我想了下是因为初始化图形是按顺序来的,但是取路径不一定是按顺序来的,BF是B的路线,取路线时首先按照长短,再是图形初始化的顺序,目前的程序并没有告知这条排好序的,有效的路径是不是真的需要。

第二个问题:判断两点是否可达有问题

只判断了2次连接,那加入一个点要另一个点有3次连接呢,比如A到D,要A-B,B-C,C-D,那其实A到D是可达的对吧,应该就是这个问题导致的BF多出来了,因为可达判断不准备,就会多用路径使得可达。

4.改进思路

按照第3点的思路,尝试改进判断可达的方法,A到F一共6个点,最长需要5次连接,就比如A到F,要A-B,B-C,C-D,D-E,E-F,应该可以用循环改造下。

这题是用早上和到了公司的前一点时间慢慢做的,做起来不太连续,可能会导致错误,欢迎对图形这块熟悉的大佬为我指点迷津。后面再加强这块的学习和实践,保持兴趣,一起共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值