【CCF 201812-4】数据中心(Kruskal算法)

本题思路

题意相当于:生成一棵树,要求这棵树的最长边最短,并求这条最长边的长度。

Kruskal算法的模板题:首先对边进行排序,随后从小到大选取边,最终得到一棵生成树。贪心的做法使得每次选取的边都是最小的,且符合题意。

满分代码(C++11)

#pragma GCC optimize(3, "Ofast", "inline")
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

struct Edge
{
    int begin, end, length;
    bool operator<(const Edge &a)
    {
        return length < a.length;
    }

    Edge(int a, int b, int c) : begin(a), end(b), length(c) {}
};

int n, m, root;
int parent[50005];
vector<Edge> edges;

void make_set()
{
    for (int i = 0; i < n; ++i)
        parent[i] = i;
}

int find_set(int x)
{
    return (x == parent[x]) ? x : parent[x] = find_set(parent[x]);
}

void union_set(int x, int y)
{
    x = find_set(x);
    y = find_set(y);

    parent[x] = y;
}

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

    cin >> n >> m >> root;

    int a, b, c;
    for (int i = 0; i < m; ++i)
    {
        cin >> a >> b >> c;
        edges.emplace_back(a, b, c);
    }

    sort(edges.begin(), edges.end());
    make_set();

    int cnt = 0, longest = -1;
    for (Edge &e : edges)
    {
        if (cnt == n - 1)
            break;
        if (find_set(e.begin) != find_set(e.end))
        {
            union_set(e.begin, e.end);
            longest = max(longest, e.length);
            ++cnt;
        }
    }

    cout << longest;

    return 0;
}

如果对您有帮助记得点个赞哦~

发布了95 篇原创文章 · 获赞 148 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/104335148