如何在无向加权图中找到给定k个不同顶点的公共最近邻点?

时间:2016-08-01 14:46:04

标签: algorithm data-structures discrete-mathematics

给出无向加权图G(V,E)。任何三个顶点都是u,v和w。找到G的顶点x,使得dist(u,x)+ dist(v,x)+ dist(w,x)最小。 x可以是G中的任何顶点(包括u,v和w)。是否存在针对此问题的任何特定算法?

2 个答案:

答案 0 :(得分:1)

您可以使用堆栈算法执行此操作,如下面的伪代码:

void FindNeigh(node node1, node node2,int graphsize)
{
    byte[graphsize] isGraphProcessed; // 0 array

    stack nodes1, nodes2; //0 arrays
    nodes1.push(node1);
    nodes2.push(node2);
    bool found = false;

    while(!nodes1.empty && !nodes2.empty())
    {
        stack tmp = null;
        for(node: nodes1)
            for(neigh : node.neighbors)
                if(!isGraphProcessed[neigh.id])
                {
                    tmp.push(neigh.id);
                    isGraphProcessed[neigh.id] = 1; // Flags for node 1
                }
                else if(isGraphProcessed[neigh.id] == 2) // The flag of node 2 is set
                    return neigh;
        nodes1 =tmp;
        tmp = null;
        for(node: nodes2)
            for(neigh : node.neighbors)
                if(!isGraphProcessed[neigh.id])
                {
                    tmp.push(neigh.id);
                    isGraphProcessed[neigh.id] = 2; // Flags for node 2
                }
                else if(isGraphProcessed[neigh.id] == 1) // The flag of node 1 is set
                    return neigh;
        nodes2 = tmp;
    }
    return NULL; // don't exist
}

如何运作

  • 您从图表的两个边缘开始
  • 您检查堆栈中的邻居
  • 如果已经在另一个节点的堆栈中添加了邻居,则表示其他节点已经到达了邻居 - >他是最近的节点。我们退货了。
  • 如果找不到任何东西,我们会对邻居的邻居做同样的事情(依此递归)直到发现某些东西。
  • 如果无法从node1到达node2,则返回0.

注意:此算法用于查找2条边之间的最小距离。如果你想为3个边缘做这个,你可以添加第3个堆栈并寻找具有3个标志的第一个节点(例如1,2和4)。

希望有所帮助:)

答案 1 :(得分:1)

如果k很大并且没有负边缘成本周期,那么Floyd Warshall的算法可以工作。它在O(|V|^3)时间内运行,完成后我们得到整个最短距离矩阵,我们可以在O(1)时间内获得任意两个顶点之间的最短距离。然后只需扫描并查找最佳顶点x,它可以提供k个顶点的总距离值的最小值。