当前位置: 首页 > 知识库问答 >
问题:

加权无向图中的总成对代价

鞠泰平
2023-03-14

假设我们有一个加权无向图,其中,对于任意两个顶点,都有一条唯一的路径连接它们。有n个顶点和1个边,每条路的成本是c\u i。

现在,如果连接两个给定顶点的每条路径都有一定的成本,这取决于它所经过的道路,那么我们如何有效地计算所有城市对之间的总成本?

例如,每条道路的成本可以是它经过的第一条道路和最后一条道路的总和,或者是它经过的每条道路的成本的某些幂的总和,或者是成本的最大值减去它经过的道路的最小值:任何取决于道路成本的公式。

为了有效地解决问题,应该使用什么算法?

共有2个答案

卫博
2023-03-14

对于图形中的每条边,通过“删除”它,可以得到两个断开连接的组件,分别是u和v。

这意味着,边是原始图形中从u中的每个节点到v中的每个节点的路径的一部分,并且存在这样的路径<这意味着,问题归结为计算这些集合的大小。

一种方法是选择任意顶点,并通过使所有边都指向外部,使其成为根。这样做之后,你就有了一棵有根的定向树。

通过在线性时间内遍历树一次,现在可以找到每个子树的大小:

size(u) = sum { size(v} | v is a child of u}  + 1

计算完所有子树的大小后,对于每个有向边(u, v),原始集|V||U|的大小是size(v)n-size(v)

遵循这些步骤可以得到线性时间延迟,并使用以下高级伪代码。

Choose arbitrary r
Calculate size(u) for all nodes
sum = 0
for each edge (u,v) do:
  sum = sum + (cost(u,v) * (size(v) * (n-size(v))))
return sum
东门城
2023-03-14

对于任何路径,让最大(p)和最小(p)表示其所经过道路的最大和最小成本。然后Total\u cost=所有路径p的总和[最大(p)-最小(p)]

然后,可以通过以下方式找到所有路径p max(p)的总和

Let G=(V,E) be the input graph, which should be a tree
Create a graph G' with vertices set V and no edges
Insert every edge in E to G' from lowest cost to hightest cost

每次插入一条边时,它将连接两个组件S、T,您可以看到,对于从S到T的每条路径,最大值(p)=成本(e),所以您可以通过求和来找到所有路径p最大值(p)的总和。为了有效地连接两个组件,我认为可以使用Kruskal算法的思想。

同样,您可以找到所有路径p min(p)的总和,最后是总成本。

 类似资料:
  • 我想知道什么是实现无向加权图的有效方法。我想在上面执行Prims和Kruskal算法。我知道邻接列表,但这不会浪费内存;为。假设我有两个顶点A和B,由权重为“x”的边连接,所以我需要在邻接列表中添加两个条目: 我是不是漏掉了什么?

  • 背景:我是图论的新手,特别是“图割”。请不要太技术和速度。谢谢。 假设我有一个加权无向连通图G=(V,E)。我有一个变量a,它包含一个整数值,我想从图G中删除/裁剪所有权重低于a值的边。 问题1:如果图论中已经存在这一点(我看到了max-cut、min-cut、s-t cut,等等),它怎么称呼? 问题2:我如何使用数学符号正式表达/定义这种方法。 谢谢你的建议。

  • 我有一个文本文件中的数据,我想创建一个无向加权图,因为我从文件中读取它。数据由tweet组成。对于tweet中的每个单词,我在图中创建一个节点。对于其他单词,我在它们之间创建一条边,并为它们的权重增加1。因此边缘的权重应该是所有tweet中出现的两个单词的数量。 我创建一个图表: 我使用两个节点的ID获取它们之间的边: 但是,即使图形是无向的,也无法找到从id2到id1的边。因此,我使用了以下方法

  • 我知道Bellman Ford算法使用负权值,但我希望我可以修改我现有的最短路径方法。

  • 我遇到了一个问题,我必须找出给定图形中的最长路径。我有一个边列表(例如,{AB,BC}),它表明在顶点/节点(A,B,C)之间有一条边。现在我想计算出可能的最长路径(不重复顶点),这样它可以覆盖从任何顶点/节点开始的最大节点。 解决这个问题的最佳方法是什么?我必须把它作为一个计划来实施。 我在谷歌上查找最小生成树、Dijkstra的算法等等。但我想不出什么最适合解决这个问题。 任何帮助或阅读参考资

  • 我试图将这个问题概念化,然后为它编写Java代码。我知道这里有一些讨论,但我没有看到很多回答者,所以我想通过写下我的想法来重申这个问题,我希望从你们那里得到一些反馈。谢谢 我的想法:对于每个叶节点,找到从根节点到它的最长路径。对于所有路径,找到最大路径长度 然而,这不就是蛮力吗,对此还有更优雅的解决方案吗? 我听说过使用Djikstra的负权重算法,但在某些地方它说这只适用于特定情况?我也看到了关