介绍
这个问题我曾经处理时,对电信网络的路由优化算法的设计和实施工作。鉴于一个节点和互连链路的广域网可以建模为一个顶点和边的图,是经常发生的问题,发现一双任何通信终端节点之间所有可能的路径组合(不含周期)。请注意,这是不是只找到一对节点,为Dijkstra'a算法可以很容易地聘用之间的最短路径的问题。
另外一个因素是,该算法应该能够处理与单向(单程),其假定是双向的边缘的边缘和图两个图。
源代码和类似的C算法实现{A}。背景
国家标准和技术研究所(NIST)的算法和数据结构的在线词典描述这个特定的问题,因为{A2的}找到任意节点对之间的所有非周期性路径。网络建模
是仿照使用下面的链接类,以确定各个环节的终端节点与链路连接:class Link
{
public:
Link( int source, int target )
{
sourceNode = source;
targetNode = target;
}
void GetSourceTargetNodes( int& source, int& target )
{
source = sourceNode;
target = targetNode;
}
protected:
int sourceNode;
int targetNode;
};
下面是网络类存储拓扑信息,并执行基本操作,如添加新的链接,检查存在的链接,并设置网络的双向状态:{C}
标准的STL地图用于容纳所有的网络链接:键值组成的一个std :: pair的唯一标识每一个环节元素,映射到链接对象的指针:std::map< std::pair<int,int>, Link*> link_map;
不同的序列容器,如一个std :: vector,关联容器如一个std ::地图,特别是在有效地访问它的元素,其关键。或许是非常大的网络,可能会导致一些哈希表中进一步提高效率,但我现在的std ::地图卡住。链接双向状态
如果双向状态值设置为true,然后端节点之间的联系[A,B,将被视为相同,如果链接的节点B,A]。
因此,在双向模式下添加新的链接时,如果一个链接已经被创建并通过指定的终端节点,[2,5],然后尝试添加另一端节点之间[5,2]链接的增加将是不成功的,因为这将被视为已经存在。定向(单向)图表,即双向的状态设置为false,添加另一端节点之间[5,2]连结会成功,因为他们是作为两个单独的链接。深度优先搜索算法
可以看到的代码示例,从起始节点开始,该算法检查所有外向链接,并通过扩大搜索树的出现,搜索逐步更深,直到找到目标节点的第一个子节点的进展,或直到它遇到一个节点,有没有孩子。搜索,然后回溯,返回到最近的节点,它并没有完成探索:{体C3}例1:一个有向图
这里是一个5节点的有向图的图形表示。例如,一个定向边之间存在[1,3],但不是节点[3,1],因此节点之间的单箭头[1,3]对节点:
{S0的}
在主程序循环,网络设置有向边,即双向状态设置为false。个别环节插入通过网络对象的AddLink,方法的调用:{的C4}
要找到所有的节点之间[2,5]的路径可能组合,例如,我们只需指定的起点和目标节点和喂他们的DepthFirst的方法:{C5的}
为了让下面的输出,显示节点2和5之间的所有路径组合:
{S}例2:双向链接
下面是一个包含非定向(双向)链接仅8节点网络的图形表示。对于双向联系,我分配与使用清晰的箭头链接,因为在两个方向的交通将允许:
{S2的}
当创建网络双向联系,双向状态设置为true,然后再创建所需的拓扑使用AddLink方法。如果一个链接已经被添加(发言权)节点1到2之间,然后添加一个链接从节点2到1不会创建一个额外的链接,因为它会被视为已经存在:{5233}
给下面的输出显示路径含有双向链接只为这8个节点的网络节点2和5之间所有可能的组合:
{S3的}| AndyUk06