1

我是一名大学生,这是我的算法分析教授传给我们班的作业。我没有使用作业标签,因为它将被弃用,但它基本上是作业。任何帮助是极大的赞赏。

我们将使用读取标准中的 xml 的任何语言编写程序,并将其绘制到程序屏幕上,并使用BFS 算法来计算<graphml...>该图有多少节点、边和连接的组件。

我已经使用graphsharp的c#图形布局库制作了这个程序,它在读取xml时绘制图形,但只计算按钮单击时的项目​​以对其进行交互。

我已经完成了这个绘图+计数部分。问题是这个graphsharp项目几乎没有文档,我需要显示BFS通过我的图表的顺序。我做了一些非常简单的事情,在 BFS 执行期间更改节点的标签名称,如下所示:

  • “n0”变成“n0-1”
  • “n1”变成“n1-2”
  • 很快...

我遇到的问题是:

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

顶点是否仅“可创建”,不可编辑?

4

2 回答 2

1

创建一个具有属性的自定义顶点类Name。而不是创建新顶点(因为 graph.vertices[i] = "newstr" 意味着您将第 i 个对象更改为全新的对象/字符串),而是更改Name现有顶点的内容(定义的属性)。

如果您使用自定义顶点类型,您应该定义一个自定义 DataTemplate 以便能够按预期呈现您的顶点。

于 2012-10-22T22:32:59.997 回答
0

我想我知道为什么这个组件在它的边缘部分被设为只读。这可能与这些图形的渲染方式有关。我在下面制作了另一个示例代码,删除了一条边并将其添加回图表(这将在一定程度上实现您的目标,但可能也不是您想要的(似乎没有其他方法可以更改图表中的边) ))。

在我看来,您希望在实际绘制图形之前布置好树(我认为这也是组件的意图)。让我知道你是否可以完成它。

    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;
于 2012-10-22T15:44:52.353 回答