C#从pair对象创建一个路由

时间:2016-04-13 12:30:12

标签: c# arrays sorting

我有一个问题。

我需要从卡片创建路线。卡片包含出发点和目的地点。例如,有三张卡" 伦敦 - >纽约"," 悉尼 - >莫斯科" 和" 纽约 - >悉尼&#34 ;.排序后必须有一个集合" 伦敦 - >纽约,纽约 - >悉尼悉尼 - >莫斯科"

你能帮帮我,我应该用什么算法来解决这个问题?我可以通过很多循环来做到这一点,但这种方式对我来说并不是最优的。

1 个答案:

答案 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