37 lines
962 B
C#
37 lines
962 B
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace Assets.Map
|
|
{
|
|
public class Graph<T>
|
|
{
|
|
public List<T> Vertices { get; internal set; } = new List<T>();
|
|
public ISet<(int, int)> Edges { get; internal set; } = new HashSet<(int, int)>();
|
|
|
|
public void AddEdge(int a, int b)
|
|
{
|
|
Edges.Add(a < b ? (a, b) : (b, a));
|
|
}
|
|
|
|
public IEnumerable<(int, int)> EdgesOf(int a)
|
|
{
|
|
return Edges.Where(x => x.Item1 == a || x.Item2 == a);
|
|
}
|
|
|
|
public Graph<U> Morph<U>(Func<T, U> morph)
|
|
{
|
|
var result = new Graph<U>() { Edges = Edges };
|
|
|
|
result.Vertices.AddRange(Vertices.Select(morph));
|
|
|
|
return result;
|
|
}
|
|
|
|
public IEnumerable<int> Neighbours(int vertex)
|
|
{
|
|
foreach (var (a, b) in this.EdgesOf(vertex))
|
|
yield return a == vertex ? b : a;
|
|
}
|
|
}
|
|
} |