有问题,我把它减少到如下问题:
在连接的无向图中,边权是从一端到另一端的时间。有些人站在某个顶点。现在,他们想要在一起见面,找到一个地方(顶点),在一定时间内T,所有人都会到达这个集合点。尽量减少这个T.
如果您需要保证金案例,请提供更多信息:无负边缘;循环可能存在;不止一个人可以留在同一个顶点;顶点可能没有人;无向边缘,权重测量u-> v或v-> u;人们从他们最初的位置开始;
如何有效地找到它?我应该为每个节点v计算max(SPD(ui,v)),其中ui是其他人的位置,然后在这些最大时间中选择最小的一个?还有更好的方法吗?
答案 0 :(得分:1)
我相信它可以在多项式运行时绑定中完成,如下所示。在第一遍中求解All-Pairs Shortest Path problem以获得具有所有顶点的相应长度的最短路径的矩阵;然后迭代行(或列)并选择一个列,其中包含用户所在的所有索引的最大条目。
答案 1 :(得分:0)
可以通过从所有顶点创建并行Dijkstra,并在一组访问节点在一个节点中相交时停止。可以通过计数来检查交叉点。算法草图:
node_count = [1, 1, ...] * number_of_nodes # Number of visited sets node is in
dijkstras = set of objects D_n performing Dijsktra's algorithm starting from node n
queue = priority queue that stores tuples (first_in_queue_n, D_n).
first_in_queue_n is next node that will be visited by D_n
initialized by D_n.first_in_queue()
while:
first_in_queue_n, D_n = queue.pop_min()
node_count[first_in_queue_n] += 1
if node_count[first_in_queue_n] == number_of_nodes:
return first_in_queue_n
D_n.visite_node(first_in_queue_n)
queue.add( D_n.first_in_queue() )