我自学c#并且我对图结构中的节点有点困惑。到目前为止,我已将这些代码拼凑在一起,但我不知道如何从列表中删除整个节点:
public class Graph
{
private int _V;
private int _E;
private LinkedList<Int32>[] adj;
public Graph(int V)
{
this._V = V;
adj = new LinkedList<Int32>[_V];
for (int v = 0; v < _V; v++)
{
adj[v] = new LinkedList<Int32>();
}
}
public void AddEdge(int v, int w)
{
_E++;
adj[v].AddFirst(w);
adj[w].AddFirst(v);
}
public void RemoveEdge(int v, int w)
{
_E--;
adj[v].Remove(w);
adj[w].Remove(v);
}
public IEnumerable<Int32> Adj(int v)
{
return adj[v];
}
public int V()
{
return _V;
}
public bool isLeaf(int v)
{
return adj[v].Count() == 1;
}
public int adjacencies(int v)
{
return adj[v].Count();
}
public String toString()
{
StringBuilder s = new StringBuilder();
String NEWLINE = Environment.NewLine;
s.Append(adj[1].Count + NEWLINE);
s.Append(_V + " vertices, " + _E + " edges " + NEWLINE);
for (int v = 0; v < _V; v++) {
s.Append(String.Format("{0:d}: ", v));
foreach (int w in adj[v]) {
s.Append(String.Format("{0:d} ", w));
}
s.Append(NEWLINE);
}
return s.ToString();
}
}
所以,如果我有四个节点,其中节点1的边缘为2,2则边缘为3和4,3和4彼此共享边缘,我想完全删除节点1,因为它&#39一片叶子。我可以很容易地删除边缘,但该节点仍然保留在我的列表中(只是没有边缘)。我怎么完全摆脱1?我以为我应该能够做一个adj.Remove(1),但是会抛出一个错误。
我意识到这可能非常容易,但我在这里看到的答案似乎是在描述不同的东西,或者我根本就没有弄清楚它是如何运作的。
谢谢!
答案 0 :(得分:0)
阵列不支持删除。如果您确实需要将“不存在”的概念编码到adj
中,那么您可以将adj[v]
设置为表示“不存在”的值。例如,
adj[v] = null.
或者,您可以在Dictionary<Int32>
中存储邻接关系。而不是
private LinkedList<Int32>[] adj;
你会有
private Dictionary<Int32, LinkedList<Int32>> adj;
你可以通过
删除顶点vadj.Remove(v); // don't forget to remove the edges
在任何一种情况下,您可能都希望更新其他方法来处理这种“已移除”的顶点。