使用wight sum找到k个x连接的顶点t

时间:2017-11-15 14:53:22

标签: algorithm graph

我有一个无向图G(E,V),顶点有权重。我需要找到每个k连接的顶点,使它们的权重之和小于数字t。 我遇到的主要问题是与圈子打交道。 很乐意得到任何想法......即使它不是一个完整的算法

- - - - - - - - 编辑

到目前为止,我有以下想法(不起作用)..

  1. 我知道每个组件都有一个扩展树,当我查看该树的根(R)(k个顶点的树,总和在t下)时,我有以下选项:R有一个儿子,他是这种树的根,有k-1个顶点|| R有两个儿子,一个是树的根,k-2,树的另一个儿子根有1个顶点(儿子本身),依此类推...... 所以要找到R我想使用动态编程。首先在V中找到每个v的最小树,其中1个顶点是v的根。然后2 ..并通过上面的想法找不到其余的。 问题是,例如:如果R只有一个子u和k-1顶点的最小树,你的根是包含R,那么事实证明R不是k个顶点树的根...当有u是不包含R和W(T(k-1))+ W(R)<0的k-1树(非最小)的根的选项。吨...

  2. 我尝试通过在V中为eac v构建具有k层的BFS树来处理这个问题,但是我认为我失去了选项,因为BFS树剂量包含所有边缘。

  3. 3.想到可能将这个问题转化为最大流量问题,但有些人会怎么看待如何做到这一点。

1 个答案:

答案 0 :(得分:0)

当距离与源的权重之和(由&#39; s&#39;表示)大于或等于&#39; t&#39;时,可以使用广度优先搜索和停止处理节点。 / p>

这些方面的东西(Java样式代码):

private void bfs(Graph G, int s) {
    Queue<Integer> q = new Queue<>();
    for (int v = 0; v < G.V(); v++)
        distTo[v] = INFINITY;
    distTo[s] = 0;
    marked[s] = true;
    q.enqueue(s);

    while (!q.isEmpty()) {
        int v = q.dequeue();

        for (int w : G.adj(v)) {
            if (!marked[w] && distTo[v] + weights[v] < t) { // preventing going beyond accumulated weight 't'
                distTo[w] = distTo[v] + weights[v];
                marked[w] = true;
                q.enqueue(w);
                edgeTo[w] = v;
            }
        }
    }
}

我上面使用的字段主要是数组,它们的索引应该是顶点v(假设图中的所有节点都是从0到n - 1的整数):

private boolean[] marked;  // marked[v] = is node v already visited ?
private int[] edgeTo;      // edgeTo[v] = previous edge on shortest s-v path
private int[] distTo;      // distTo[v] = number of edges shortest weights s-v path
private int[] weights;     // weights[v] = weight of v

处理bfs例程后,所有标记的节点的距离应小于t。

您可以通过标记节点来处理圈子,以便不再重新访问它们。