1

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?

leobelones
  • 578
  • 1
  • 8
  • 24
  • I saw some code of this QuickGraph before. Can it be that you need to add them as strings? So, graph.AddVertex("string_x");? – pdvries Oct 22 '12 at 15:28
  • nope, the graph is shown already with the vertices and edges read from the xml. It has only the ids of them like (n0)->(n2)->(n6) and so on... I want to make it become (n0-1)->(n2-2)->(n6-3)... so it's not adding new vertices, but editing the ones already existent – leobelones Oct 22 '12 at 15:45
  • I'm not sure about that. Why can't you start building what you want until you have it "(n0-1)->(n2-2)..."? From what I can see of the QuickGraph-component these properties that you need are read-only. Therefore, it doesn't leave you much of a choice unless you want to change the source-code. I don't see the problem. I would need some more code (like from the XML) to clarify. – pdvries Oct 22 '12 at 16:25

2 Answers2

1

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.

Palesz
  • 2,104
  • 18
  • 20
0

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;
pdvries
  • 1,372
  • 2
  • 9
  • 18
  • no, you're duplicating the graph size. I need to edit the node instead of creating new ones with the new values. – leobelones Oct 22 '12 at 15:48
  • what if you loop through the Edges-property and reset the object or target? – pdvries Oct 22 '12 at 15:59
  • it says in the tooltip of Visual Studio that the Source-target has no setter. Can't you just build the tree using some algorithm at once? Initially there seems to be no way to change this at runtime from what I can see. – pdvries Oct 22 '12 at 16:15
  • TVertex Source { get; } TVertex Target { get; } – pdvries Oct 22 '12 at 16:17
  • I still haven't managed to do it... I'll this that you are suggesting, and if it doesn't work I think I'll try something in these lines you're suggesting... maybe when I click to run the BFS I destroy my graph and recreate it with the new labels and replot it... might work... anyways, i'll keep you posted – leobelones Oct 22 '12 at 20:15
  • I marked your answer as correct, but it is not completely right. I had to destroy the graph and recreate it and send an INotifyPropertyChanged so the program could rebuild the graph. The problem I had with your method is that there is no method "RemoveEdge" on the graph. Other than that, your idea was very helpful! Thanks – leobelones Oct 23 '12 at 14:58
  • I'm glad to have been able to help out. However, I suggest you also have a look at the suggestion by @Palesz. By the way, I used a 'BidirectionalGraph' for the graph and this does have a method 'RemoveEdge' (this does work). – pdvries Oct 23 '12 at 16:03