从图结构c#

时间:2017-04-13 23:44:54

标签: c# graph

我自学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),但是会抛出一个错误。

我意识到这可能非常容易,但我在这里看到的答案似乎是在描述不同的东西,或者我根本就没有弄清楚它是如何运作的。

谢谢!

1 个答案:

答案 0 :(得分:0)

阵列不支持删除。如果您确实需要将“不存在”的概念编码到adj中,那么您可以将adj[v]设置为表示“不存在”的值。例如,

adj[v] = null.

或者,您可以在Dictionary<Int32>中存储邻接关系。而不是

private LinkedList<Int32>[] adj;

你会有

private Dictionary<Int32, LinkedList<Int32>> adj;

你可以通过

删除顶点v
adj.Remove(v); // don't forget to remove the edges

在任何一种情况下,您可能都希望更新其他方法来处理这种“已移除”的顶点。