【问题标题】:Construct a weighted graph such that each edge between node u and v is 1 if (u is divisible by v or v is divisible by u) else the weight is n+1构造一个加权图,使得节点 u 和 v 之间的每条边都是 1,如果(u 可被 v 整除或 v 可被 u 整除)否则权重为 n+1
【发布时间】:2022-01-16 03:51:48
【问题描述】:

给你一个整数 n,它是图中节点的数量。边的权重为:

  • u->v = 1 if (u 可被 v 整除或 v 可被 u 整除) 之间的边权重
  • v->u = n+1 if(u 不能被 v 整除) 之间的边权重

给你 q 个查询,我们需要找到它们之间的最短距离。

我尝试了这个问题,但我面临的唯一问题是我应该如何使用给定条件构造加权图,因为 N

这里是一个更好解释的例子

N=6 Q=2 {(1,3),(3,4)}

这是图表的样子

U -> V = weight
1->2=7
1->3=7
1->4=7
1->5=7
1->6=7
2->4=1
2->6=1
3->6=1

所以查询的答案是

for (1->3) = 7
for (3->4) = 3->6->2->4 = 3

【问题讨论】:

  • 为什么 1->2 的权重是 7? 2 能被 1 整除吗?
  • “我想如何构建加权图” - 你不应该这样做。有人以图形问题的名义来装点数学问题,希望诱骗人们浪费时间尝试构建图形。
  • 您的设置不一致。根据第一条规则,边 6->2 的权重为 1,因为 6 可被 2 整除。根据第二条规则,边 6->2 的权重为 n+1,因为 2 不能被 6 整除。除非两者兼有n 为零。
  • 我的意思是,答案看起来像 1 或 2。但规格不一致,因此可能是 1 或 n+1。您似乎对问题的理解不足以描述它。

标签: c++ graph-theory depth-first-search shortest-path


【解决方案1】:

用指定的边权重构造一个图。

假设您有一个带有添加边的方法的图形类

vpod AddEdge(int src, int dst, int weight);

然后

LOOP u from 1 to N
    LOOP v from u+1 to N
        weight = 7
        IF ( u % v == 0 || v % u == 0 )
            weight = 1
        graph.AddEdge( u,v, weight );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多