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

图-如何获得最小权连通子集?

乐正辰阳
2023-03-14

以下是消费税:

以下是我得到的:

>

  • 我不得不假设权重是正负混合的。只有这两种重量的混合才有意义。

    我会先对边进行排序,所以负边会在先。

    我会考虑使用克鲁斯卡尔的算法,但应该有一些修改

    因为我欢迎负边,所以我会尝试添加尽可能多的负边。

    此外,一些正边可能被添加到只是在不是所有负边都连接的情况下,他们可能需要一些正边作为桥。

    {0,1}的权重为-20

    {2,3}的重量为-10

    如果{1,3}的权重为11,那么我当然不想要{1,3}

    这意味着仍然需要包括所有顶点。

    而且它不仅仅是一个MST。假设一个顶点有两条边,一条是-1,另一条是-2。在一个普通的MST算法中,只有边-2将被采取。但在这个消费税中,都需要采取-1和-2以进一步减少整体重量。

  • 共有1个答案

    郎诚
    2023-03-14

    我认为你的算法基本上已经是正确的了,但是只要稍加修改,实现起来就变得微不足道了。

    首先,每一个负边必须包括,以最小化产生的权重。接下来,计算连接组件的数量C。如果c=1,就完成了。否则,您需要额外的C-1正边。

    现在,当你添加负边时,把这看作是一个Kruskal的算法过程。每一个负边都可以把克鲁斯卡尔森林里的几棵树结合在一起。然而,即使负边的两端属于克鲁斯卡尔森林中的同一棵树,也要添加负边--不像通常的克鲁斯卡尔算法,在那里只添加联合两棵不同树的边。

    以下是一些伪代码:

    sort(edges);
    c := n;
    for edge in edges:
        if edge.weight < 0:
            if find(edge.firstEnd) != find(edge.secondEnd):
                --c;
            unite(edge.firstEnd, edge.secondEnd);
        else:
            if c == 1: break;
            if find(edge.firstEnd) != find(edge.secondEnd):
                unite(edge.firstEnd, edge.secondEnd);
                --c;
    

    这里unitefind是不相交集数据结构的函数。

     类似资料:
    • 这是我的算法。 我做了一个。每次当我找到时,我都知道我得到了一个有向循环。 然后我将暂时沿着向后(直到我在循环中遍历所有顶点),并计算。 我的算法正确吗? 如果我的算法正确,时间复杂度是多少? 这个问题有没有更好的算法?

    • 这是我的doubht List chars=new ArrayList(); 上述列表中包含的值是[A, A, B, B, C, D, E]; 我想得到一个作为输出,因为这是根据ascii的最小值。如何在java中获取此值。

    • 问题内容: 我正在使用Windows 10,Python 3.5和tensorflow 1.1.0。我有以下脚本: 我得到错误: 问题答案: 如果您写: 然后不是图层,而是图层的输出。该层是 所以看来您的意思是: 这是完整的代码段:

    • 考虑一个不连通的有向图的例子,其中顶点和边其中顶点是孤立的。 根据这里的答案:(对强连通图的最小加法),保证这个图所需的最小边数结果是3。 如何找到将这些边添加到哪里,即图中一条边的起始点和终止点?

    • 问题内容: 我正在处理高度不平衡的数据集,我的想法是从我的 libSVM 模型中获取特征权重的值。到目前为止,我对线性内核还可以,我可以在其中获得特征权重,但是当我使用或时,我无法达到目标。 在这里,我正在使用我的模型,并且可以使用轻松获得线性核的特征权重。谁能帮助我可以做同样的事情还是?到目前为止,我已尝试执行以下操作: 问题答案: 正如文档中所述,这不仅是不可能的: 权重分配给特征(原始问题的

    • 问题内容: 我想检索用户的所有权限作为权限ID的列表,但是: 给我权限名称列表。怎么做? 问题答案: 关键是获取这样的权限对象: 在这里您可以像这样访问属性: 如果您想要该列表,请执行以下操作: 希望能帮助到你!