我是一名大学生,这是我的算法分析教授传授给我们班级的一项功课。我不使用家庭作业标签,因为它被弃用,但它基本上是功课。非常感谢任何帮助。
我们要使用任何读取<graphml...>
标准中的xml的语言创建程序,并将其绘制到程序屏幕,使用{{告诉图表有多少个节点,边和连接的组件。 3}}计数。
我已经使用graphsharp的c#图形布局库制作了这个程序,加上它在xml读取上绘制图形,但只计算按钮点击上的项目以给它一些交互。
我已经完成了这个绘图+计数部分。问题是这个graphsharp项目几乎没有文档,我需要显示BFS通过我的图表的顺序。我做了一些非常简单的事情,比如在BFS执行过程中更改节点的标签名称,如下所示:
我得到的问题是:
Property or indexer 'QuickGraph.IVertexSet<object>.Vertices'
cannot be assigned to -- it is read only
顶点只是“可创建”,不可编辑吗?
答案 0 :(得分:1)
创建一个具有属性Name
的自定义顶点类。而不是创建新顶点(因为graph.vertices [i] =“newstr”意味着您将第i个对象更改为全新的对象/字符串),更改现有顶点的内容(定义{{1}}属性)。
如果使用自定义顶点类型,则应定义自定义DataTemplate,以便能够按预期渲染顶点。
答案 1 :(得分:0)
我想我已经知道为什么这个组件在Edge-part中被设为只读。这可能与渲染这些图形的方式有关。我在下面创建了另一个示例代码,删除了Edge并将其添加回图形(这将在某种程度上实现您的目标,但可能也不希望您想要(在图中似乎没有其他方法可以更改Edge) ))。
在我看来,在你真正绘制图形之前,你希望你的树被放置(我认为这也是组件的意图)。如果你能完成它,请告诉我。
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;