有向图的分区

6
我正在尝试基于一组关键顶点将网络分成一个或多个部分。 我有代码来解决我的问题(至少对我感兴趣的情况是这样),但为了确保正确性,我正在寻找我所做的事情在图论中的名称,甚至是等效算法或过程的参考资料。
输入网络是具有单个源和汇顶点的有向图。结果分区必须具有与原始图相同的属性(有向图,单个源顶点,单个汇顶点),并且还要求每个分区只能有两个关键集合中的顶点,并且它们必须是初始和终止顶点。
编辑
如果源和汇是相同的顶点,则结果子图将包含一个循环。 现有代码可用于检测和删除此类循环。
结束编辑
在这种情况下,图表值得千言万语。 我已经绘制了一个简单的图形,彩色顶点表示关键顶点,虚线是图的分区。

alt text

在这种情况下,意图是找到1-1、1-3、1-7、3-1、3-3、3-7、7-1、7-3或7-7之间的任何可能分区。实际存在的只有1-3、3-3和3-7分区(见下图)。此外,由于3-3分区无效,因此重新标记了图形以消除不一致性。

alt text

如果有帮助的话,我的类似Python的伪代码通过执行一系列前向和后向图遍历来识别所有可能的分区。
def graphTraversal(graph,srcid,endids):
    '''
    Given a graph, start a traversal from srcid, stopping search 
    along a branch any time a vertex is in endids.

    Return the visited subgraph 
    '''
    closed = set()
    open = set([srcid])
    while len(open) != 0:
        i = open.pop()
        for j in graph.succ(i):
            if (i,j) not in closed:
                if j not in endids:
                    open.add(j)
                closed.add( (i,j) )
    return = graphFromList(closed)

def findAllValidPartitions(graph,srcids):
    res = []
    for n in srcids:
        g2    = graphTraversal(graph,n,t)
        g2rev = reverseEdgesInGraph(g2)
        for s in srcids:
            g3    = graphTraversal(g2rev ,s,t)
            g3rev = reverseEdgesInGraph(g3)
            g3rev = removeCycles(g3rev,s)
            if len(g3rev .E) > 0:
                res.append(g3rev)
    return res
1个回答

2

你确定分区具有与整个图相同的属性吗?例如,你绘制的绿色分区没有源和汇(它是一个循环)。 - Dmitry
不幸的是,这样的循环经常发生。但是,它们很容易被检测到,并且可以通过对编码所有相同信息的图进行重新标记来消除它们。 - Andrew Walker
那么为什么是“3”而不是“2”被认为是“关键”的呢?它们在流方面似乎是等价的。我仍然不理解“关键”顶点的定义。 - Dmitry
所以,“critical”与图结构无关?好的。绿色划分也很可疑,因为它只包含一个关键顶点,而你说一个划分“应该只有两个关键顶点”。你是指“不超过两个”吗? - Dmitry
不,只有两个是必要的。我已经尝试通过展示最终图表以及与如何处理周期相关的更正来澄清。 - Andrew Walker
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接