我有一个问题。
我需要从卡片创建路线。卡片包含出发点和目的地点。例如,有三张卡" 伦敦 - >纽约"," 悉尼 - >莫斯科" 和" 纽约 - >悉尼&#34 ;.排序后必须有一个集合" 伦敦 - >纽约,纽约 - >悉尼悉尼 - >莫斯科"
你能帮帮我,我应该用什么算法来解决这个问题?我可以通过很多循环来做到这一点,但这种方式对我来说并不是最优的。
答案 0 :(得分:2)
我建议构建2个哈希映射(c#的常规字典)来构建前后Adjacency matrix。在此之后,只迭代没有输入链接(开始节点)的节点列表。如果您知道什么是起始节点(b),如果您只有一个起始节点,则可以优化以下算法(a)。
using System;
using System.Collections.Generic;
using System.Linq;
using CityPair = System.Tuple<string, string>; //just for short
namespace cards
{
class Program
{
static void Main(string[] args)
{
var source = new[]
{
Tuple.Create("London", "New-York"),
Tuple.Create("Sydney", "Moscow"),
Tuple.Create("New-York", "Sydney")
};
//convert to hash-map
var graphIncedence = //not needed if you know start-node
new Dictionary<string, CityPair>(source
.ToDictionary(x => x.Item1, x=>x));
//convert to inverted hash_map
var invertedGraph =
new Dictionary<string, CityPair>(source
.ToDictionary(x => x.Item2, x => x));
//find all nodes without input links
var startNodes = graphIncedence
.Where((pair) => !graphIncedence.ContainsKey(pair.Value.Item2))
.Select(pair=> pair.Value).ToList();
//for each start node build a path
foreach (var start in startNodes) //remove it if only 1 start node
{
Console.Write("Start node is: '{0}'", start.Item2);
//produce list where items just follow after startNode
for (var next = start.Item1; next != null;)
{
Console.Write("-> {0}", next);
CityPair result;
next = !invertedGraph.TryGetValue(next, out result)
? null : result.Item1;
}
Console.WriteLine();
}
}
}
}
输出:
Start node is: 'Moscow'-> Sydney-> New-York-> London