C#连接路径的分离度

时间:2016-10-08 17:25:08

标签: c# c++ algorithm graph breadth-first-search

我对图表很陌生,试图找出为此创建图表的正确方法:

鉴于City所拥有的一系列城市和州际公路,需要了解其他城市道路是否与波士顿相应的城市之一以及分离程度相交。

例如:如果波士顿是需要计算连接州际学位的城市,则0是波士顿的分离程度。如果纽约可以直接连接到波士顿,那么分离度为1,如果纽约通过不同的城市道路连接到波士顿,则分离度为2,依此类推

E.g输入:

Boston,I-94;I-90
NewYork,I-80;I-94
Seattle,I-80;I-5

E.g输出:

0, Boston
1, NewYork
2, Seattle

我已将输入数据转换为具有连接城市的Dictionary<string,List<string>>。试图弄清楚如何构建图表或我可以使用Dictionary<string,List<string>>来做BFS的方式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;

namespace DegreesOfSeperation
{
    public class Program
    {
        public static void Main(string[] args)
        {
            /* Enter your code here. Read input from STDIN. Print output to STDOUT */

            //use dictionary to store the values for creating the graph            
            Dictionary<string, List<string>> vertices = new Dictionary<string, List<string>>();

            string str = null;
            //skip the lines with # and decrement the counter to avoid index out of bounds error
            while ((str = Console.ReadLine()) != null && str != "")
            {                   
                    String[] strArr = str.Split(',');
                    string cityKey = strArr[0];

                    //use dictionary to store the values for creating the graph                    
                    vertices.Add(cityKey , new List<string>());
                    vertices[cityKey ].AddRange(strArr[1].Split(';'));
            }

            if (vertices.Count > 0)
            {
                //create a new dictionary to insert the final vertices with neighbors
                Dictionary<string, List<string>> vertices1 = new Dictionary<string, List<string>>();

                foreach (var item in vertices)
                {
                    var currentValues = item.Value.ToList();
                    var matchingKeys = (vertices.Where(vertex => vertex.Value.Any(value => currentValues.Contains(value))).Select(pair => pair.Key)).Where(keys => keys != item.Key);

                    //add values to the dictionary with the new matching vertices/nodes
                    vertices1[item.Key] = matchingKeys.ToList();
                }

                //Now Vertices1 has the transformed values as below
                //Boston: NewYork
                //NewYork: Boston, Seattle
                //Seattle: NewYork
                //How to form the Graph and do the Breadth-First-Search here ??
            }           
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这可以通过图中的广度优先搜索(BFS)来解决。此算法为您提供一个树,其根是您开始的城市,从那里到任何其他节点/城市的唯一路径是具有最少跳跃的那个。

如果您需要所有城市/节点的此信息,请为每个城市运行一次算法。

对于BFS及其运行时间的解释,一个好的来源是例如维基百科。

BFS需要一个图表作为输入,最好由邻接列表给出。因此,给定数据首先需要转换:在列表上运行,并为每个城市商店直接连接到的城市:

Boston: NewYork NewYork: Boston, Seattle Seattle: NewYork

现在您维护了三条信息:使用波士顿(在您的情况下)初始化的工作队列Q,使用波士顿初始化的“已连接”城市的列表S和数组{{1 “前辈”:对于每个城市,这将包含波士顿路径上的前一个城市。对于波士顿来说,这指向零。

在队列中运行:选择P中的第一个条目c,运行其邻接,当遇到未连接的城市时将其添加到Q,将其前身设置为{{ 1}}并将其添加到S的末尾。

如果每个城市都可以从波士顿实际到达,那么你就会得到一棵“前辈”的树。要确定城市的距离,请遵循从这个城市到波士顿的前辈。