using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; using System.Text; //TODO: unweighted adjacency list and weighted adjacency list namespace DataStructures.AdjacencyList { [Serializable] public class AdjacencyList { private readonly Dictionary> dict; public IList Vertices { get { return dict.Keys.ToList(); } } public int Count { get { return dict.Count; } } public AdjacencyList() { dict = new Dictionary>(); } public AdjacencyList(int capacity) { Contract.Requires(capacity > 0); dict = new Dictionary>(capacity); } public void AddVertex(T vertex) { Contract.Requires(vertex != null); if(dict.ContainsKey(vertex)) { return; } dict[vertex] = new HashSet(); } public void AddEdge(T vertex1, T vertex2) { Contract.Requires(vertex1 != null); Contract.Requires(vertex2 != null); if (!dict.ContainsKey(vertex1)) { dict[vertex1] = new HashSet(); } if (!dict.ContainsKey(vertex2)) { dict[vertex2] = new HashSet(); } dict[vertex1].Add(vertex2); dict[vertex2].Add(vertex1); } public bool IsNeighbourOf(T vertex, T neighbour) { Contract.Requires(vertex != null); Contract.Requires(neighbour != null); return dict.ContainsKey(vertex) && dict[vertex].Contains(neighbour); } public IList GetNeighbours(T vertex) { Contract.Requires(vertex != null); return dict.ContainsKey(vertex)? dict[vertex].ToList(): new List(); } public IList this[T vertex] { get { return GetNeighbours(vertex); } set { Contract.Requires(vertex != null); dict[vertex] = new HashSet(value); } } public IList> GetEdgeList() { var list = new List>(); foreach (var entry in dict) { var key = entry.Key; var hashSet = entry.Value; list.AddRange(hashSet.Select(hashEntry => new Tuple(key, hashEntry))); } return list; } } }