【发布时间】:2010-02-10 23:37:05
【问题描述】:
我正在尝试提出一种遍历树的算法,但我卡住了。
这是一个相当难的问题(与我问过的其他问题相比),所以我可能需要自己继续思考。但我想我会把它扔在这里。
我有以下类结构:
public class Transition
{
// The state we are moving from.
public String From { get; set; }
// All the To states for this from
public List<String>To { get; set; }
}
List<Transition> currentTransistions;
当 currentTransitions 完全填写时,它看起来像这样(对我来说):
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfTransition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Transition>
<From />
<To>
<string>Not Done</string>
</To>
</Transition>
<Transition>
<From>Not Done</From>
<To>
<string>In Progress</string>
<string>Deleted</string>
</To>
</Transition>
<Transition>
<From>Deleted</From>
<To>
<string>Not Done</string>
</To>
</Transition>
<Transition>
<From>In Progress</From>
<To>
<string>Done</string>
<string>Ready For Test</string>
<string>Deleted</string>
</To>
</Transition>
<Transition>
<From>Done</From>
<To>
<string>In Progress</string>
</To>
</Transition>
<Transition>
<From>Ready For Test</From>
<To>
<string>In Progress</string>
<string>Done</string>
<string>Deleted</string>
</To>
</Transition>
</ArrayOfTransition>
这里的想法是我已经映射了 TFS 工作项的状态转换。我现在需要的是一种方式来表达“给定当前状态,我如何到达另一个状态”。
理想情况下应该是这样的:
foreach (string state in GetToFinalState(finalState, currentState, currentTransistions)
{
// Save the workitem at the state so we can get to the final state.
}
GetToFinalState,必须有一种方法来计算最短路径并使用 C# 的 yield 功能为 foreach 语句一次提供一个。
我以前使用过 yield one,所以我想我可以解决这个问题。但是我不确定如何在找到最短路径的同时做到这一点(无需在函数中的每次重新计算)?
如果您已经阅读到这里,谢谢。如果您提供答案,那么非常感谢。
【问题讨论】:
-
@Vaccano:为了记录,您的示例图不是树。例如,它有循环(未完成 -> 已删除 -> 未完成)。根据定义,树不能有循环。具体来说,它是一个有向非加权图。 定向,因为存在从 A 到 B 的过渡并不意味着存在从 B 到 A 的过渡。未加权,因为没有分配给 a 的价值/成本/权重过渡和所有过渡都被平等对待。