CodePlexProject Hosting for Open Source Software

- Download the GraphLibrary.dll from the Downloads section.
- Add GraphLibrary.dll as a reference to your .NET project.
- Add a using GraphLibrary reference in your source code.

A project goal was to make graph creation easy. No matter what type of graph you want (directed, undirected) you will always work with the IGraph<T,U> interface for your graph operations. The code below shows the basic

operations of the graph library.

//Creates an undirected graph with integer vertex data and double edge data IGraph<int, double> graph = GraphFactory.CreateGraph<int,double>(GraphTypes.Undirected); //Create two stand-alone vertices IVertexId id1 = graph.AddVertex(1); id1.FriendlyName = "First Vertex"; IVertexId id2 = graph.AddVertex(2); id2.FriendlyName = "Second Vertex"; //Create an edge and access the IVertexids from the IEdgeId. IEdgeId eid1 = graph.AddVertices(3.0, 3, 4); IVertexId id3 = eid1.VertexId1; id3.FriendlyName = "Third Vertex"; IVertexId id4 = eid1.VertexId2; id4.FriendlyName = "Fourth Vertex"; //Create an edge between two existing vertices. IEdgeId eid2 = graph.AddEdge(4.0, id1, id2);

The key to using the graph library lies in the IVertexId and IEdgeId interfaces. In order to access a vertex (or edge) you must provide the graph with an IVertexId that the graph provided either from adding a vertex or adding an edge. The ids generated are unique to the graph, meaning that no two vertices will have the same IVertexId, even if they have the same vertex data value. See the code below:

IGraph<int, double> graph = GraphFactory.CreateGraph<int,double>(GraphTypes.Undirected); //These are two different vertices even though they have the same vertex data value. IVertexId id1 = graph.AddVertex(1); IVertexId id2 = graph.AddVertex(1);

Now suppose you wanted to update the vertex with data value 1, you'll need to specify a particular IVertexId. The graph.ReplaceVertex(..) method replaces the vertex data based on an existing IVertexId to ensure that the right vertex is being changed.

int vertexData1 = graph.GetVertexData(id1); //vertexData1 = 1 int vertexData2 = graph.GetVertexData(id2); //vertexData2 = 1 if(graph.ReplaceVertex(id2)) { vertexData1 = graph.GetVertexData(id1); //vertexData1 = 1 vertexData2 = graph.GetVertexData(id2); //vertexData2 = 2 }

Important note about the FriendlyName property. It means nothing to the graph and cannot be used to find a vertex in the graph. It is useful for storing the IDs in a data structure such as a dictionary for easy

retrieval. Setting the property is a local change since you receive a copy of the IVertexId or IEdgeId used by the graph.

Do

Use the IGraphTraverser<T,U> interface to traverse a graph. Here is an example using the depth first traverser

IGraph<int, int> graph = GraphFactory<int, int>.CreateGraph(GraphTypes.Undirected); IVertexId v1 = graph.AddVertex(1); IVertexId v2 = graph.AddVertex(2); IVertexId v3 = graph.AddVertex(3); IVertexId v4 = graph.AddVertex(4); IVertexId v5 = graph.AddVertex(5); IEdgeId v1Tov2 = graph.AddEdge(1, v1, v2); IEdgeId v2Tov4 = graph.AddEdge(2, v2, v4); IEdgeId v2Tov3 = graph.AddEdge(3, v2, v3); IEdgeId v1Tov3 = graph.AddEdge(4, v1, v3); IEdgeId v3Tov4 = graph.AddEdge(5, v3, v4); IEdgeId v3Tov5 = graph.AddEdge(6, v3, v5); IGraphTraverser<int, int> traverser = new DepthFirstTraverser<int, int>(); traverser.Graph = graph; IList<int> results = traverser.Traverse(v1); foreach(int i in results) { Console.Write( "{0} ", i); } //output will be 1 3 5 4 2

To use, just create your graph and create a Traverser. Set the Traverser.Graph property to your graph and then traverse using a starting vertex.

Last edited Jan 13, 2010 at 6:29 PM by gavinmead, version 7