#c# #graph-theory
#c# #теория графов
Вопрос:
у меня есть такой метод:
ребра такие
4 это количество узлов
1 2 1 первые два значения — это вершины, а третий элемент — это вес ребер
4 1 2
2 3 2
1 3 5
public static List<Tuple<long,long>>[] WeightedGraph(long NodeCount,long[][] edges)
{
List<Tuple<long, long>>[] Weightedgraph = new List<Tuple<long, long>>[NodeCount 1];
for(int i=0; i<Weightedgraph.Length;i )
{
Weightedgraph[i] = new List<Tuple<long, long>>();
}
foreach(var vertex in edges)
{
**Weightedgraph[vertex[0]].Add();**
}
}
как я могу завершить ** часть?
Комментарии:
1. Просто пример
Weightedgraph[0].Add(new Tuple(1, 2));
2. что вы ожидаете добавить к
Weightedgraph[vertex[0]]
3. первый узел всегда является начальным, и я реализую его с помощью списка<Tuple<long, long>>[], где индексы массива, показывающие начальные узлы, и 2 других свойства будут добавлены в список tuple<long,long> элемент 1 — это другой узел, а элемент 2 — это вес.
4. Если вы хотите использовать информацию о ребрах позже, я бы предложил сделать
.ToLookup()
, чтобы вы могли легко получить доступ ко всем ребрам данной вершины
Ответ №1:
Самый простой способ — использовать Tuple.Create(long, long)
:
public static List<Tuple<long, long>>[] WeightedGraph(long NodeCount, long[][] edges)
{
List<Tuple<long, long>>[] weightedgraph = new List<Tuple<long, long>>[NodeCount 1];
for (int i = 0; i < weightedgraph.Length; i )
{
weightedgraph[i] = new List<Tuple<long, long>>();
}
foreach (var vertex in edges)
{
weightedgraph[vertex[0]].Add(Tuple.Create(1L, 2L));
}
return weightedgraph;
}
Однако обратите внимание, что для C # версии 7 или более поздней вы можете использовать синтаксис (x, y)
«кортеж значений», чтобы упростить работу и предоставить более значимые имена для элементов кортежа.
В примере ниже я изменил ваш код для вызова элементов кортежа X и Y:
public static List<(long X, long Y)>[] WeightedGraph(long nodeCount, long[][] edges)
{
var weightedgraph = new List<(long X, long Y)>[nodeCount 1];
for (int i = 0; i < weightedgraph.Length; i )
{
weightedgraph[i] = new List<(long X, long Y)>();
}
foreach (var vertex in edges)
{
weightedgraph[vertex[0]].Add((1L, 2L));
}
return weightedgraph;
}
Комментарии:
1. Я полагаю, вам следует упомянуть, что он известен как кортеж значений и доступен с C # 7
Ответ №2:
Давайте добавим удобочитаемость (какой индекс что означает):
// I've changed NodeCount into int:
// do you really want a graph with more than 2e9 vertexes?
public static List<Tuple<long,long>>[] WeightedGraph(int NodeCount, long[][] edges) {
//TODO: validate NodeCount and edges
// Naming: "WeightedGraph" is the method's name; "result" is what we return
// Initialization: we want
List<Tuple<long, long>>[] result = Enumerable
.Range(0, NodeCount) // NodeCount vertexes
.Select(node => new List<Tuple<long, long>>()) // Each has a List<T> of edges
.ToArray(); // Organized as an array
foreach (var edge in edges) {
// Let's add readability end decrypt edges format
int vertexFrom = (int) (edge[0]);
long vertexTo = edge[1];
long edgeWeight = edge[2];
result[vertexFrom].Add(Tuple.Create(vertexTo, edgeWeight));
}
return resu<
}