【问题标题】:How to find smallest connected label in equivalency list如何在等价列表中找到最小的连接标签
【发布时间】:2020-06-04 10:24:40
【问题描述】:

我有一个存储在标准向量中的数字列表。其中一些数字是其他数字的子代。这是一个例子

3, 4
3, 5
5, 6
7, 3
8, 9
8, 1
8, 2
9, 8

或者作为图表:

1 2 3-4 5-6 7 8-9
|-------------|
  |-----------|
    |---|     
    |-------|

即有两个簇 3,4,5,6,7 和 1,2,8,9。根号是簇的最小号。这里是 3 和 1。我想知道我可以使用哪些算法来提取这样的列表:

3, 4
3, 5
3, 6
3, 7
1, 2
1, 8
1, 9

【问题讨论】:

  • 该向量中的数字是如何存储的?
  • 可能有更好的方法,但您可以创建一个名为 cluster 的结构,其中包含节点和边。创建一个集群列表,每个数字一个集群。将数字添加到节点以及与边的每个关系。迭代集群并合并具有公共边的集群。删除一个集群和另一个集群之间的所有边。重复,直到您删除所有边缘。找到根值。
  • 数字是否总是 1 到 N 或相似的?换句话说,它们可以用作索引吗?
  • @Nelfeal 数字不能总是用作索引。
  • @ThomasSablik 目前我正在使用以下数据结构:std::vector<std::vector<unsigned int>> list。处理后列表大小为N x 2

标签: c++ algorithm graph-algorithm


【解决方案1】:

一个类似不相交集并集算法的算法可以帮到你:

  • 初始化N不相交子集,每个子​​集只有一个数字,而数字i(r(i))的根为i
  • 对于每条边(u, v),您可以分配:
    t = min(r(u), r(v))
    r(u) = t
    r(v) = t
  • 对于每个ii != r(i),您可以写出[r(i) - i]

【讨论】:

  • 您能说得更具体些吗? ruv 是什么? i (r(i)) 是什么意思?您能否提供该算法的良好来源?
  • @Random9。我认为这是指一种称为“Union Find”的算法。我用谷歌搜索了“union find”,然后出现了几个合理的点击。我看了一些,他们似乎都解释得很好。所以谷歌一下,应该很清楚。
  • N 是数字的数量。 r(i) 是数字 i 的根。 uv 是两个已连接的号码。这是关于不相交集联合算法的维基:en.wikipedia.org/wiki/Disjoint-set_data_structure#Union
  • @dangxuanvuong98 值得编辑您的答案并从评论中添加信息。
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多