`
Simone_chou
  • 浏览: 192572 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

布线问题(最小生成树 + 并查集)

    博客分类:
  • NYOJ
 
阅读更多

布线问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
 
描述
南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
1、把所有的楼都供上电。
2、所用电线花费最少
 
输入
第一行是一个整数n表示有n组测试数据。(n<5)
每组测试数据的第一行是两个整数v,e.
v表示学校里楼的总个数(v<=500)
随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有指明花费,则表示这两栋楼直接连通需要费用太大或者不可能连通)
随后的1行里,有v个整数,其中第i个数表示从第i号楼接线到外界供电设施所需要的费用。( 0<e<v*(v-1)/2 )
(楼的编号从1开始),由于安全问题,只能选择一个楼连接到外界供电设备。
数据保证至少存在一种方案满足要求。
输出
每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。
样例输入
1
4 6
1 2 10
2 3 10
3 1 10
1 4 1
2 4 1
3 4 1
1 3 5 6
样例输出
4

 

     思路:

     最小生成树 Prim 算法 + 并查集。

 

     AC:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int INF = 999999999;

typedef struct {
    int a, b, num;
} node;

node no[505 * 505];
int v, root[505];

bool cmp (node a, node b) { return a.num < b.num; }

int Find (int x) {
    return x == root[x] ? x : root[x] = Find(root[x]);
}

void init() {
    for (int i = 1; i <= v; ++i)
        root[i] = i;
}

int main() {

    int n;
    scanf("%d", &n);
    while (n--) {
        int e;
        scanf("%d%d", &v, &e);

        init();

        for (int i = 0; i < e; ++i)
            scanf("%d%d%d", &no[i].a, &no[i].b, &no[i].num);

        sort(no, no + e, cmp);

        int sum = 0;
        for (int i = 0; i < e; ++i) {
            int A = Find(no[i].a);
            int B = Find(no[i].b);
            if (A != B) {
                sum += no[i].num;
                root[A] = B;
            }
        }

        int Min = INF;
        for (int i = 0; i < v; ++i) {
            int ans;
            scanf("%d", &ans);
            Min = min(Min, ans);
        }

        printf("%d\n", sum + Min);
    }

    return 0;
}

 

  

分享到:
评论

相关推荐

    最小生成树+设计文档

    在工程规划、交通网络设计、电路布线等领域,最小生成树问题也有着关键作用。 4. **设计文档**:设计文档通常会详细记录最小生成树问题的解决方案,包括算法的选择、实现细节、时间复杂度和空间复杂度分析,以及...

    最小生成树(用堆+并查集进行优化)

    例如,在Kruskal算法中,可以先按边的权重排序,然后用并查集维护连通性,当尝试添加一条边时,通过并查集快速判断是否形成环,若不形成环则添加至最小生成树。 7. **时间复杂度**: Prim算法的时间复杂度通常为O...

    最小生成树kruskal算法

    接下来,通过遍历边数组并使用并查集判断是否形成环路,逐步构建最小生成树。在这个过程中,`Find`函数用于查找元素所在集合的根节点。 #### 性能分析 Kruskal算法的时间复杂度主要取决于边的排序和并查集的操作。...

    数据结构——图的最小生成树(邻接矩阵、普利姆)

    ### 数据结构——图的最小生成树(邻接矩阵、普利姆) #### 概述 ...在实际应用中,最小生成树可以应用于许多场景,例如网络设计、电路板布线等领域。掌握这些基础知识有助于更好地理解和解决实际问题。

    最小生成树

    HDUACM201509版_07并查集(最小生成树).ppt文件很可能包含了关于这个问题的详细讲解,包括并查集的建立、维护以及如何与Kruskal算法结合来求解最小生成树的问题。 并查集是一种用于处理连接关系的数据结构,它可以...

    最小生成树代码

    最小生成树是图论中的一个重要概念,用于解决网络中连接所有顶点的树形结构问题,使得树的所有边的权重之和最小。在实际应用中,例如设计公路网络、电路板布线等,都可能用到这个算法。在这个场景中,我们讨论的是...

    最小生成树进一步拓展

    由于需要判断新加入的边是否形成环,通常使用并查集(Disjoint Set)数据结构,因此其时间复杂度为O(ElogE+Eα(V)),其中α(V)是并查集操作的逆 Ackermann 函数,实际中α(V)非常小,可以近似认为是常数。...

    数据结构课设cpp含报告 打包下载

    最小生成树问题在计算机科学,特别是图论与数据结构领域中是一个重要的概念。它涉及到如何在加权无向图中找到一棵包括所有顶点的树,使得这棵树的所有边的权重之和尽可能小。这个问题在实际应用中广泛出现,比如在...

    mintreek最小生成树

    Kruskal算法作为一种经典且高效的求解最小生成树的方法,通过简单的排序和并查集操作实现了高效求解。通过对`mintreek`函数的详细分析,我们可以更好地理解Kruskal算法的核心思想及其在实际编程中的应用方式。

    最小生成树源代码

    - **旅游路线规划**:旅行商问题中,可以先求出各个城市之间的最小生成树,然后在此基础上进行优化,得到较为经济的旅行路线。 ### 二、代码实现解析 #### 1. 数据结构定义 - **Edge类**:表示图中的每条边,包含...

    最小生成树_最小生成树_

    在实际应用中,最小生成树问题常见于电信网络设计、交通路线规划、电路布线等场景,目标都是在满足连接性要求的同时,降低成本或消耗。MATLAB作为强大的数学和工程计算工具,非常适合处理这类问题,其内置的优化工具...

    将图转化为最小生成树

    在实现最小生成树算法时,我们通常使用数据结构如优先队列(对于Prim算法)或并查集(对于Kruskal算法)来优化性能。 总的来说,最小生成树是解决网络优化问题的一种基础方法,它能够有效地帮助我们在各种复杂情境...

    最小生成树的方法完成室内布线问题 (2).docx

    同时,最小生成树的构建还需要避免形成环路,这通常通过并查集或栈来辅助实现。 总的来说,这个程序设计涉及到图论中的最小生成树问题,通过定义数据结构和相应的算法,解决了在室内布线中如何以最小成本连接所有...

    Krustral算法实现最小生成树

    在实际应用中,最小生成树算法常用于求解交通网络规划、电路板布线等问题,具有广泛的应用价值。 通过以上详细讲解,我们对Kruskal算法有了深入的理解,并了解了其C语言实现的关键步骤。实践中,需要结合具体的数据...

    最小生成树(数据结构)

    在实际应用中,最小生成树常用于解决如网络设计、电路布线、物流配送等问题,寻找成本最低的方案。例如,设计一个城市的道路网络时,我们希望连接所有的区域,同时使总建设成本最低,这就是最小生成树问题的应用。 ...

    最小耗费生成树

    特别是学会了如何利用贪心法求解最小耗费生成树问题,并掌握了并查集这种数据结构的应用。此外,还了解了如何使用C/C++语言实现这些算法,包括排序、查找父节点等操作的具体实现方法。 #### 六、代码示例分析 实验...

    数据结构最小生成树实习报告

    6. **实际应用**:除了理论部分,报告可能会介绍如何将最小生成树的概念应用于实际问题,如交通网络设计、电路布线等。 7. **实验结果与讨论**:可能会展示算法运行的实例,比较Prim和Kruskal算法在不同图结构下的...

    最小生成树的kruskal算法(c++源码)

    最小生成树是图论中的一个重要概念,用于解决网络优化问题,特别是在有向或无向加权图中寻找连接所有顶点的边集,使得这些边的总权重最小。Kruskal算法是解决这一问题的一种经典算法,由Joseph Kruskal在1956年提出...

    Python采用Kruskal(克鲁斯卡尔)算法实现最小生成树

    ### Python 实现 Kruskal(克鲁斯卡尔)算法...通过上述代码,我们可以看到如何利用 Kruskal 算法和并查集数据结构来构建一个最小生成树。这种方法不仅适用于解决特定问题,而且有助于深入理解图论的基本概念及其应用。

Global site tag (gtag.js) - Google Analytics