给出无向加权图G(V,E)。任何三个顶点都是u,v和w。找到G的顶点x,使得dist(u,x)+ dist(v,x)+ dist(w,x)最小。 x可以是G中的任何顶点(包括u,v和w)。是否存在针对此问题的任何特定算法?
答案 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
}
如何运作
注意:此算法用于查找2条边之间的最小距离。如果你想为3个边缘做这个,你可以添加第3个堆栈并寻找具有3个标志的第一个节点(例如1,2和4)。
希望有所帮助:)
答案 1 :(得分:1)
如果k
很大并且没有负边缘成本周期,那么Floyd Warshall的算法可以工作。它在O(|V|^3)
时间内运行,完成后我们得到整个最短距离矩阵,我们可以在O(1)
时间内获得任意两个顶点之间的最短距离。然后只需扫描并查找最佳顶点x
,它可以提供k
个顶点的总距离值的最小值。