如何确定节点在图形数据结构中是否有多个输入?

时间:2012-02-08 22:18:19

标签: java graph

我正在尝试为字符串调制创建一个简单的网络 Network of modules

这个想法是网络的输出是最后执行的模块的输出 模块可以以任何方式排列,如果模块必须作为输入连接,则应对输入求和(字符串连接)。

为了实现它,我想将网络表示为图形数据结构。

现在阻止我的是如何确定模块有两个连接作为输入(所以我可以在输入结果作为输入之前将两个输出相加)?

用于遍历图表的算法是什么?广度优先?

任何更好的解决方案来代表网络? [伪代码非常感谢]

2 个答案:

答案 0 :(得分:1)

如果您将图形存储为邻接列表(“此节点指向这些节点”),那么您可以简单地遍历邻接列表并交换A - > B对B - >; A,创建反邻接列表(“这些节点指向此节点”)。

this article中的更多信息。

编辑:

从您的图表中,邻接列表将是:

A -> [B, C]
B -> [D]
C -> [D]
D -> []

这可以表示为Map<Node, Collection<Node>>。编写一个接受一对并更新地图的方法,称之为connect。要构建结构,您可以使用connect(A, B)connect(A, C)connect(B, D)connect(C, D)来调用它。

要反转它,请创建一个新的Map来保持倒置结构。迭代映射中的每个键,然后遍历列表中的每个值,并在反转结构上调用connect,并反转参数。

答案 1 :(得分:1)

您可以在广度优先和深度优先两者中实现此功能。我要发布深度优先算法:

public class Node {

    private List<Node> parents = new ArrayList<Node>();
    private List<Node> children = new ArrayList<Node>();
    private Map<Node, String> receivedMessages = new HashMap<Node, String>();
    private String id = "";

    public Node(String id) {
        this.id = id;
    }

    void processMessage(Node sender, String message) {
        if (parents.contains(sender))
            receivedMessages.put(sender, message);

        // if all the parents sent the message
        if (receivedMessages.size() == parents.size()) {
            String newMessage = composeNewMessage(receivedMessages);

            if (children.size() == 0) // if end node or "leaf"
                ouputResult(this, newMessage);
            else {
                for (Node child : children) {
                    child.processMessage(this, newMessage);
                }
            }
        }
    }

    public void addParent(Node parent) {
        if (parent != null)
            parents.add(parent);
        parent.children.add(this);
    }

    public void addChild(Node child) {
        if (child != null)
            children.add(child);
        child.parents.add(this);
    }

    private void ouputResult(Node node, String newMessage) {
        // TODO: implement
    }

    private String composeNewMessage(Map<Node, String> receivedMessages2) {
        // TODO: implement
        return "";
    }

    public static void main(String[] args) {
        Node A = new Node("A");
        Node B = new Node("B");
        Node C = new Node("C");
        Node D = new Node("D");
        Node start = new Node("start");
        Node end = new Node("end");
        A.addParent(start);
        B.addParent(A);
        C.addParent(A);
        D.addParent(B);
        D.addParent(C);
        end.addParent(D);
        A.processMessage(start, "Message");
    }
}