C# 连接路径的分离度
C# Degree of separation for connected paths
我对图表很陌生,正在尝试找出为此创建图表的正确方法:
给定城市拥有的一组城市和州际公路,需要找出其他城市道路是否与相应城市之一相交,例如波士顿和分离度。
例如:如果波士顿是需要计算州际连接度的城市,则 0 是波士顿的分离度。如果纽约可以直接连接到波士顿,则分离度为1,如果纽约通过不同的城市道路连接到波士顿,则分离度为2,依此类推
例如输入:
Boston,I-94;I-90
NewYork,I-80;I-94
Seattle,I-80;I-5
例如输出:
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 ??
}
}
}
}
这可以通过图中的广度优先搜索 (BFS) 来解决。该算法返回一棵树,其根是您开始的城市,从那里到任何其他 node/city 的唯一路径是跳数最少的那条路径。
如果您的所有 cities/nodes 都需要此信息,那么 运行 每个城市的算法一次。
对于 BFS 及其 运行宁时间的解释,一个很好的来源是例如维基百科。
BFS 需要一个图作为输入,最好由邻接表给出。因此,给定数据首先需要进行转换:运行 遍历列表,并为每个城市存储与其直接相连的城市:
Boston: NewYork
NewYork: Boston, Seattle
Seattle: NewYork
现在您维护三个信息:使用波士顿初始化的工作队列 Q
(在您的例子中)、S
个 "already connected" 个城市的列表 "already connected" 使用波士顿初始化和一个数组P
of "predecessors":对于每个城市,这将包含从波士顿出发的路径上的前一个城市。对于波士顿,这指向零。
运行 在队列中:选择 Q
中的第一个条目 c
,在其邻接点 运行 中,每当遇到未连接的城市时,将其添加到 S
,将其前身设置为c
,并将其添加到Q
的末尾。
如果实际上可以从波士顿到达每个城市,那么您将以 "predecessors" 的树结束。判断一个城市的距离,跟随前辈从这个城市到波士顿的距离。
我对图表很陌生,正在尝试找出为此创建图表的正确方法:
给定城市拥有的一组城市和州际公路,需要找出其他城市道路是否与相应城市之一相交,例如波士顿和分离度。
例如:如果波士顿是需要计算州际连接度的城市,则 0 是波士顿的分离度。如果纽约可以直接连接到波士顿,则分离度为1,如果纽约通过不同的城市道路连接到波士顿,则分离度为2,依此类推
例如输入:
Boston,I-94;I-90
NewYork,I-80;I-94
Seattle,I-80;I-5
例如输出:
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 ??
}
}
}
}
这可以通过图中的广度优先搜索 (BFS) 来解决。该算法返回一棵树,其根是您开始的城市,从那里到任何其他 node/city 的唯一路径是跳数最少的那条路径。
如果您的所有 cities/nodes 都需要此信息,那么 运行 每个城市的算法一次。
对于 BFS 及其 运行宁时间的解释,一个很好的来源是例如维基百科。
BFS 需要一个图作为输入,最好由邻接表给出。因此,给定数据首先需要进行转换:运行 遍历列表,并为每个城市存储与其直接相连的城市:
Boston: NewYork
NewYork: Boston, Seattle
Seattle: NewYork
现在您维护三个信息:使用波士顿初始化的工作队列 Q
(在您的例子中)、S
个 "already connected" 个城市的列表 "already connected" 使用波士顿初始化和一个数组P
of "predecessors":对于每个城市,这将包含从波士顿出发的路径上的前一个城市。对于波士顿,这指向零。
运行 在队列中:选择 Q
中的第一个条目 c
,在其邻接点 运行 中,每当遇到未连接的城市时,将其添加到 S
,将其前身设置为c
,并将其添加到Q
的末尾。
如果实际上可以从波士顿到达每个城市,那么您将以 "predecessors" 的树结束。判断一个城市的距离,跟随前辈从这个城市到波士顿的距离。