联合的两个网络图

时间:2014-03-05 19:46:17

标签: algorithm nodes graph-theory topology

有人能指出正确的数据结构/算法来完成以下任务吗?

我想结合(Union?)以下两组节点来获得第三组节点。

谢谢!

enter image description here

2 个答案:

答案 0 :(得分:4)

通常,图表可以表示为邻接矩阵或邻接列表。要么将它们结合起来并不难。

从邻接列表的角度来看,你有

list1 = [[A,[B,K]],[B,[C,D,E]],...]
list2 = [[A,[B]],[B,[C,D,E]],...]

所以你要做的就是在邻接列表中为每个节点联合子列表

list3 = [[A,UNION([B,K],[B])]...]

对于邻接矩阵,它是微不足道的。只需循环遍历矩阵中的每个aij,如果它是0并且另一个矩阵中的相应条目是1,则将其设置为1.

如果图1有类似的内容:

    A   B   C
A   1   1   0
B   0   1   0
C   0   1   1

和图2有类似的东西:

    A   B   C
A   1   1   0
B   0   1   1
C   0   0   1

然后图3最终会以

结束
    A   B   C
A   1   1   0
B   0   1   1
C   0   1   1

答案 1 :(得分:4)

简短回答

  1. 联合节点集。
  2. 联盟边缘集。
  3. 长答案

    我假设您正在使用图形数据结构,其中有Node个实例,其中每个Node都有string Namelist<Node> Next

    让我们调用您的两个图表GH,其中图表为list<Node>

    GNamesHNames成为每个图表中的节点名称集。让MNames成为GNamesHNames的结合。

    创建一个新图表list<Node> M,其中Node中的每个名称都有一个新MNames

    为每个map<string, Node> GLookup, HLookup, MLookup构建Node作为从节点名称到list<Node> G, H, M的映射。

    对于此新图Node u中的每个M,将NextNames计算为GLookup[u.Name].Next.Select(v => v.Name)HLookup[u.Name].Next.Select(v => v.Name)的联合,然后为每个名称nameNextNames中,将MLookup[name]添加到u.Next

    M现在是您的合并图表。

    的伪代码

    list<Node> merge(list<Node> G, list<Node> H)
        GNames = G.Select(u => u.Name)
        HNames = H.Select(u => u.Name)
        MNames = union(GNames, HNames)
        M = MNames.Select(name => new Node(name))
        GLookup = G.ToMap(u => u.Name)
        HLookup = H.ToMap(u => u.Name)
        MLookup = M.ToMap(u => u.Name)
        foreach u in M
            NextNames = union(
                            GLookup[u.Name].Next.Select(v => v.Name),
                            HLookup[u.Name].Next.Select(v => v.Name))
            foreach name in NextNames
                u.Next.Add(MLookup[name])
        return M