Question

I'm a college student and this is a homework my algorithm analysis professor passed to our class. I'm not using homework tag since it's to be deprecated, but it is homework basically. Any help is greatly appreciated.

We're to make a program using any language that reads a xml in the <graphml...> standard and plot it to the program screen, telling how many nodes, edges and connected components that graph has, using a BFS algorithm to count.

I made this program already, using graphsharp's c# graph layout library, with a plus that it plots the graph on xml read, but only counts the items on a button click to give some interaction to it.

I already finished this plotting + counting part. The problem is that this graphsharp project has almost no documentation, and I needed to show the order in which the BFS travels thru my graph. I made something pretty simple, as changing label names of nodes during BFS' execution like this:

  • "n0" becomes "n0-1"
  • "n1" becomes "n1-2"
  • so on...

The problem I got is this:

Property or indexer 'QuickGraph.IVertexSet<object>.Vertices'
cannot be assigned to -- it is read only

Are the vertices only "createable", not editable?

Was it helpful?

Solution

I think I have an idea of why this component was made read-only in the Edge-part of it. It may have to do with the way these graphics are rendered. I made another sample code underneath that removes an Edge and adds it back to the graph (this would achieve your goal to some extent, but may not be want you want either (there seems to be no other way to change the Edge in the Graph)).

It seems to me that you want you're tree to be layed out before you actually draw the graph (which I think has been the intention of the component as well). Let me know if you can get it done.

    string edgeSource = "n3";
    string edgeTarget = "n4";
    string newEdgeSource = "n0";
    string newEdgeTarget = "n4";

    IEnumerator<IEdge<object>> edgeEnumeratoer = g.Edges.GetEnumerator();
    edgeEnumeratoer.MoveNext();
    while (edgeEnumeratoer.Current != null)
    {
        var edge = edgeEnumeratoer.Current;
        string source = (string)(edge.Source);
        string target = (string)(edge.Target);
        if ((source.CompareTo(edgeSource) == 0) && (target.CompareTo(edgeTarget) == 0))
        {
            if (g.RemoveEdge(edge))
            {
                IEdge<object> newEdge = new Edge<object>(newEdgeSource, newEdgeTarget);
                g.AddEdge(newEdge);
                break;
            }
            else
            {
                Debug.WriteLine("Could not remove edge from graph.");
            }
        }
        edgeEnumeratoer.MoveNext();
    }

    graphLayout.Graph = g;

OTHER TIPS

Create a custom vertex class which has a property Name. And instead of creating new vertices ( because graph.vertices[i] = "newstr" means you change the ith object to a completely new object/string), change the content (defined Name property) of the existing vertices.

If you use custom vertex types, you should define a custom DataTemplate to be able to render your vertex as expected.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top