CCF201812-4 数据中心(100分)Kruskal算法

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF201812-4 数据中心(100分)Kruskal算法相关的知识,希望对你有一定的参考价值。

试题编号: 201812-4
试题名称: 数据中心
时间限制: 1.0s
内存限制: 512.0MB


样例输入
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
样例输出
4
样例说明
  下图是样例说明。

问题链接CCF201812-4 数据中心
问题简述:求最小生成树的最大权边。
问题分析:用Kruskal算法来实现,并查集是必要的,套用一下并查集的模板就好了。
程序说明:(略)
参考链接:(略)
题记:模板是重要的,套模板程序就简单了。

100分的C++语言程序如下:

/* CCF201812-4 数据中心 */

#include <bits/stdc++.h>

using namespace std;

/* 并查集 */
const int N = 50000;
int f[N + 1], fcnt;
void UFInit(int n) {for(int i = 0; i <= n; i++) f[i] = i; fcnt = n;}
int Find(int a) {return a == f[a] ? a : f[a] = Find(f[a]);}
int Union(int a, int b) {if ((a = Find(a)) != (b = Find(b))) {f[a] = b, fcnt--; return 1;} else return 0;}

const int M = 100000;
struct Edge {
    int u, v, w;
} e[M];

bool cmp(Edge a, Edge b)
{
    return a.w < b.w;
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    cout.tie(NULL);

    /* 读入数据 */
    int n, m, root;
    cin >> n >> m >> root;
    for (int i = 0; i < m; i++)
        cin >> e[i].u >> e[i].v >> e[i].w;

    /* 初始化并查集 */
    UFInit(n);

    /* Kruskal算法 */
    sort(e, e + m, cmp);

    int ans = 0;
    for (int i = 0; i < m; i++) {
        if (Union(e[i].u, e[i].v))
            ans = max(ans, e[i].w);
        if (fcnt == 1) break;
    }

    /* 输出结果 */
    cout << ans << endl;

    return 0;
}

以上是关于CCF201812-4 数据中心(100分)Kruskal算法的主要内容,如果未能解决你的问题,请参考以下文章

CCF认证历年试题

CCF 202012-5星际旅行(20~100分)

CCF 201409-3 字符串匹配 100分

CCF201809-3 元素选择器(100分)文本处理

CCF202112-1 序列查询(100分)序列处理

CCF202112-1 序列查询(100分)序列处理