using System; using System.Collections.Generic; using System.Text; namespace GraphTest { public delegate bool VertexMapper (T left, T right); public delegate K VertexKeyer (T data); public class DirectedGraph { Dictionary> vertices; Dictionary> edges; VertexMapper mapFun; VertexKeyer keyFun; public DirectedGraph(VertexMapper mapFun, VertexKeyer hashFun) { vertices = new Dictionary>(); edges=new Dictionary>(); this.mapFun=mapFun; this.keyFun=hashFun; } public void addVertex (T obj) { Vertex newV=new Vertex(obj); foreach (Vertex v in vertices.Values) { if (mapFun(obj, v.Data)) addEdge(newV, v); if (mapFun(v.Data, obj)) addEdge(v, newV); } vertices[keyFun(newV.Data)]=newV; } public void removeVertex (T obj) { K k=keyFun(obj); vertices.Remove(k); edges.Remove(k); } public T[] getAdjacent (T obj) { K leftKey=keyFun(obj); T[] result=new T[edges[leftKey].Keys.Count]; int counter=0; foreach (K rightKey in edges[leftKey].Keys) { result[counter]=vertices[rightKey].Data; counter++; } return result; } public IEnumerable adjacent(T obj) { K leftKey = keyFun(obj); foreach (K rightKey in edges[leftKey].Keys) yield return vertices[rightKey].Data; } public IEnumerable leafDescendants(T obj) { K leftKey = keyFun(obj); Queue fringe = new Queue(); foreach (K key in edges[leftKey].Keys) fringe.Enqueue(key); while (fringe.Count > 0) { K key = fringe.Dequeue(); if (edges.ContainsKey(key)) foreach (K dK in edges[key].Keys) fringe.Enqueue(dK); else yield return vertices[key].Data; } } public IEnumerable allDescendants(T obj) { K leftKey = keyFun(obj); Queue fringe = new Queue(); foreach (K key in edges[leftKey].Keys) fringe.Enqueue(key); while (fringe.Count > 0) { K key = fringe.Dequeue(); if (edges.ContainsKey(key)) foreach (K dK in edges[key].Keys) fringe.Enqueue(dK); yield return vertices[key].Data; } } private void addEdge (Vertex left, Vertex right) { K hLeft=keyFun(left.Data); K hRight=keyFun(right.Data); if (!edges.ContainsKey(hLeft)) edges[hLeft]=new Dictionary(); edges[hLeft][hRight]=1; } private void addEdge (Vertex left, Vertex right, int weight) { K hLeft=keyFun(left.Data); K hRight=keyFun(right.Data); if (!edges.ContainsKey(hLeft)) edges[hLeft]=new Dictionary(); edges[hLeft][hRight]=weight; } } class Vertex { T data; public Vertex(T data) { this.data=data; } public T Data { get {return data;} } } struct Edge { Vertex left, right; public Edge(Vertex left, Vertex right) { this.left=left; this.right=right; } } } /* public delegate bool VertexMapper (T left, T right); public class DAG { List> vertices; List> edges; VertexMapper mapFun; public DAG(VertexMapper mapFun) { vertices=new List>(); edges=new List>(); this.mapFun=mapFun; } public void addVertex (T obj) { Vertex newV=new Vertex(obj); foreach (Vertex v in vertices) { if (mapFun(obj, v.Data)) edges.Add(new Edge(newV, v)); if (mapFun(v.Data, obj)) edges.Add(new Edge(v, newV)); } vertices.Add(newV); } public void } class Vertex { T data; public Vertex(T data) { this.data=data; } public T Data { get {return data;} } } struct Edge { Vertex left, right; public Edge(Vertex left, Vertex right) { this.left=left; this.right=right; } }*/