如何在路线仍然独特的情况下简化路线描述?

时间:2013-09-06 08:44:06

标签: c# algorithm optimization data-structures graph-theory

如果我举个例子有这样的图表:

                     -- 528a - 526 -
                    /               \
380 - 404 - 420 - 522 - 530 - 526a - 686 - 564
                          \                /
                           ------ 540 -----

从开始(380)到结束(564)遍历它会产生以下路线

 1. 380 404 420 422 522 528a 526  686 564 
 2. 380 404 420 422 522 530  526a 686 564
 3. 380 404 420 422 522 530  540  564

如何在路线仍然唯一的情况下简化路线描述?换句话说:在开始和结束之间查找定义路线以及开始和结束的节点?

在这个例子中,我想让它归结为这个结果。

 1. 380 404 420 422 522 528a 526  686 564  =>  380 528a 564 OR 380 526 564 
 2. 380 404 420 422 522 530  526a 686 564  =>  380 526a 564 
 3. 380 404 420 422 522 530  540  564      =>  380 540  564

我正在寻找一种不通过遍历图表来进行反复试验的算法。

感谢您提供任何帮助或提示

1 个答案:

答案 0 :(得分:3)

<强>观

  • 将起始节点记录为永久性。

  • 路径分裂后:

    • 删除最后记录的节点(如果它不是永久性的)

    • 记录当前节点。

  • 如果路径合并,请将最后一个节点设为永久节点。

  • 记录结束节点。

要检查路径是否分裂,您需要检查一个节点有多少个子节点(大多数图形实现应该存储它)。

要检查路径是否合并,您需要检查节点有多少父节点(大多数图形实现可能不会存储)。

使节点永久化的想法是阻止在此处删除23

    2       5
  /   \   /   \
1 - 3 - 4 - 6 - 7

我还必须补充一点,我不太清楚为什么要记录起始节点和结束节点,因为这些节点对于你的所有示例都是相同的,除非它们与其他示例不同。

<强>示例:

Graph:
                     -- 528a - 526 -
                    /               \
380 - 404 - 420 - 522 - 530 - 526a - 686 - 564
                          \                /
                           ------ 540 -----

Input: 380 404 420 422 522 528a 526 686 564

Splits before 528a, so record it.
Make 528a permanent at 686.

Output: 380 528a 564


Input: 380 404 420 422 522 530  526a 686 564

Splits before 530, so record it.
Splits before 526a, so remove 530 and record 526a.
Make 526a permanent at 686.

Output: 380 526a 564


Input: 380 404 420 422 522 530  540 564

Splits before 530, so record it.
Splits before 540, so remove 530 and record 540.
Make 540 permanent at 564.

Output: 380 540 564