我有一个JSON如下 -
[
{
"From": "Sydney",
"To": "Dubai",
"Duration": 1
},
{
"From": "Dubai",
"To": "Venice",
"Duration": 2
},
{
"From": "Venice",
"To": "Rio",
"Duration": 3
},
{
"From": "Venice",
"To": "Sydney",
"Duration": 1
},
{
"From": "Sydney",
"To": "Rio",
"Duration": 7
}
]
我想找到JSON中城市之间的最短路径。我们的想法是开发一种方法,该方法只接受一个城市名称作为输入,并显示到所有其他目的地的最短路径。
让我们假设我们已经提供了悉尼作为输入,我正在寻找的输出是
Selected City: Sydney
To 1: Dubai, Smallest Path Length: 1, Path: Sydney, Dubai.
To 2: Venice, Smallest Path Length: 3, Path: Sydney, Dubai, Venice.
To 3: Rio, Smallest Path Length: 6, Path: Sydney, Dubai, Venice, Rio.
(N.B. Sydney-Rio is 7 hours long hence Sydney-Dubai-Venice-Rio
is the shortest route here which takes 2 hours).
我的尝试 -
var json = [
{
"From": "Sydney",
"To": "Dubai",
"Duration": 1
},
{
"From": "Dubai",
"To": "Venice",
"Duration": 2
},
{
"From": "Venice",
"To": "Rio",
"Duration": 3
},
{
"From": "Venice",
"To": "Sydney",
"Duration": 1
},
{
"From": "Sydney",
"To": "Rio",
"Duration": 7
}
]
public string Path(string city, JObject json)
{
string result = null;
return result;
}
private void xBox_SelectedIndexChanged(object sender, EventArgs e)
{
Path(xBox.SelectedText, json);
}
现在开发一种照顾上述方法.... 但是怎么样?我在挠头!!!!
答案 0 :(得分:1)
以下是算法的步骤: 让我们开始的节点称为初始节点。设节点Y的距离是从初始节点到Y的距离.Dijkstra算法将分配一些初始距离值,并尝试逐步改进它们。
为每个节点分配一个暂定距离值:为我们的初始节点设置为零,为所有其他节点设置为无穷大。
将初始节点设置为当前节点。标记未访问的所有其他节点。创建一组称为未访问集的未访问节点。
对于当前节点,考虑所有未访问的邻居并计算其暂定距离。将新计算的暂定距离与当前指定值进行比较,并指定较小的临时距离。例如,如果当前节点A标记为距离为6,并且将其与邻居B连接的边长度为2,则到B(通过A)的距离将为6 + 2 = 8.如果B先前为标记距离大于8然后将其更改为8.否则,保持当前值。
当我们考虑当前节点的所有邻居时,将当前节点标记为已访问并将其从未访问的集合中删除。永远不会再次检查访问过的节点。
如果目标节点已被标记为已访问(当计划两个特定节点之间的路由时)或未访问集中的节点之间的最小暂定距离是无穷大(计划完整遍历时;当有初始节点和剩余的未访问节点之间没有连接),然后停止。算法已经完成。
否则,选择标记有最小暂定距离的未访问节点,将其设置为新的"当前节点",然后返回步骤3.