using System; using System.Collections.Generic; using System.Linq; namespace Assets.Common { [Serializable] public class Graph { public List Vertices { get; internal set; } = new List(); public Dictionary> _edges = new Dictionary>(); public T this[int i] => Vertices[i]; public IEnumerable<(int, int)> Edges { get { return _edges.SelectMany(pair => pair.Value.Where(value => value > pair.Key).Select(value => (pair.Key, value))); } set { _edges = new Dictionary>(); foreach (var (a, b) in value) AddEdge(a, b); } } public void AddEdge(int a, int b) { if (!_edges.ContainsKey(a)) _edges[a] = new List(); if (!_edges.ContainsKey(b)) _edges[b] = new List(); _edges[a].Add(b); _edges[b].Add(a); } public Graph Morph(Func morph) { var result = new Graph() { Edges = Edges }; result.Vertices.AddRange(Vertices.Select(morph)); return result; } public IEnumerable Neighbours(int vertex) { if (!_edges.ContainsKey(vertex)) return Enumerable.Empty(); return _edges[vertex]; } } }