我有一些无向且无权图的节点子集。我想确定所有这些节点之间是否存在路径,并且如果存在,最短的路径应该包含尽可能少的不在节点子集中的节点。
我一直在尝试想出一种修改最小生成树算法来实现这个目标,但是迄今为止我还没有想出可行的解决方案。
有没有好的方法来解决这个问题,或者已经存在某种已知的算法可以用来解决这个问题?
我一直在尝试想出一种修改最小生成树算法来实现这个目标,但是迄今为止我还没有想出可行的解决方案。
有没有好的方法来解决这个问题,或者已经存在某种已知的算法可以用来解决这个问题?
var allNodesAreConnected = StartNode.AllNodes.All(n => n.IsConnectedToStartNode);
或者如果你想知道哪些节点没有连接,稍微改变一下:
var anotConnectedNodes = StartNode.AllNodes.Where(n => !n.IsConnectedToStartNode);
更多示例和完整代码请参见本文: 创建您自己的导航系统(使用图形、节点和连接类)
使用Dijkstra算法或广度优先搜索。
您应该使用狄克斯特拉最短路径算法。首先,您必须为图中的所有边分配权重(或距离),连接两个不在子集中的节点的每条边都必须赋予权重1。将连接子集中一个或两个节点的每条边都赋予无限权重。其次,您应该在结果图上运行狄克斯特拉算法。 此算法将检查图的每条边。
此外,您还可以使用A*(A星)算法。
更新: 我一开始并不理解这个问题。正如@amit所说,这是一个NP难题,HCP和TSP的组合。也许某种随机搜索算法可以在多项式时间内以高概率解决这个问题。