我有一个无向图G(E,V),顶点有权重。我需要找到每个k连接的顶点,使它们的权重之和小于数字t。 我遇到的主要问题是与圈子打交道。 很乐意得到任何想法......即使它不是一个完整的算法
- - - - - - - - 编辑
到目前为止,我有以下想法(不起作用)..
我知道每个组件都有一个扩展树,当我查看该树的根(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树(非最小)的根的选项。吨...
我尝试通过在V中为eac v构建具有k层的BFS树来处理这个问题,但是我认为我失去了选项,因为BFS树剂量包含所有边缘。
3.想到可能将这个问题转化为最大流量问题,但有些人会怎么看待如何做到这一点。
答案 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。
您可以通过标记节点来处理圈子,以便不再重新访问它们。