图C就像在C#中实现一样

时间:2014-02-10 18:55:26

标签: c# data-structures

所以我有一个对象(让我们称之为Head),它有一个对象列表C(C1,C2,C3,...),T(T1,T2,...)和M(M1,M2) ,...)所有这些都是相互关联的,例如

Head -> C1,C2,C3 , T1 , T2 , M1 , M2
T1   -> C1,C2  
T2   -> C2,C3 
M1   -> C1, C2,C3 
M2   -> C1, C2

其中“ - >”暗示“与......有关”

So Head has 7 successors and 0 predecessors
   T1 has 1 predecessor(Head ) and 2 successors(C1,C2)
   M1 has 1 predecessor(Head ) and 3 successors(C1,C2,C3)
and so on

我想过创建一个以后继者和前辈为属性的类,但是我不确定如何从Head对象构建这个图形结构?

1 个答案:

答案 0 :(得分:2)

这实际上取决于您需要对图表执行的操作。最简单的存储是List<Node>,其中每个Node对象包含指向其前任和后继的链接。 (当然还有一些数据)

您可以在此列表中执行几乎所有操作,但算法可能具有某种数据结构,从而使其更高效/更快。根据需要转换为此。对于初始化,例如:

class Example
{
    public List<Node> InitGraph()
    {
        var nodes = new Dictionary<string, Node>();

        nodes.Add("Head", new Node("Head"));
        nodes.Add("T1", new Node("T1"));
        nodes.Add("T2", new Node("T2"));
        // While that works, a method is nicer:
        nodes.Add("C1");

        // These two lines should really be factored out to a single method call
        nodes["Head"].Successors.Add(nodes["T1"]);
        nodes["T1"].Predecessors.Add(nodes["Head"]);
        nodes["Head"].Successors.Add(nodes["T2"]);
        nodes["T2"].Predecessors.Add(nodes["Head"]);

        // Yes. Much nicer
        nodes.Connect("Head", "C1");
        nodes.Connect("T1", "C1");
        nodes.Connect("T2", "C1");

        var nodelist = new List<Node>(nodes.Values);
        return nodelist;
    }
}
public static class NodeHelper
{        
    public static void Add(this Dictionary<string, Node> dict, string nodename)
    {
        dict.Add(nodename, new Node(nodename));
    }
    public static void Connect(this Dictionary<string, Node> dict, string from, string to)
    {
        dict["Head"].Successors.Add(dict["T2"]);
        dict["T2"].Predecessors.Add(dict["Head"]);
    }
}

public class Node
{
    public string Name { get; set; }
    public int Coolness { get; set; }
    public List<Node> Predecessors { get; set; }
    public List<Node> Successors { get; set; }
    public Node()
    {
        Coolness = 1;
    }

    public Node(string name) : this()
    {
        this.Name = name;
    }
}

对于实际的初始化阶段,我会从文件中读取它。首先是所有节点,然后是连接它们的所有边缘。制作一些不错的加载/保存方法,以确保它们一致。


虽然我已经扩展了示例(并且它编译了),但我还是向读者留下了测试。它应该给你一个很好的起点。