[kuangbin带你飞]专题六 最小生成树 I

I - Agri-Net

题目链接:https://vjudge.net/contest/66965#problem/I

题目:

农夫约翰当选为他镇上的市长!他的竞选承诺之一是为该地区的所有农场提供互联网连接。当然,他需要你的帮助。
    农夫约翰为他的农场订购了一个高速连接,并将与其他农民分享他的连接。为了最大限度地降低成本,他希望将最少量的光纤用于将农场连接到所有其他农场。
    给出连接每对农场需要多少光纤的列表,您必须找到将它们连接在一起所需的最少光纤数量。每个服务器场必须连接到其他服务器场,以便数据包可以从任何一个服务器场流向任何其他服务器场。
    任何两个农场之间的距离不会超过100,000。
输入
    输入包括几种情况。对于每种情况,第一行包含农场数N(3 <= N <= 100)。以下行包含N x N锥度矩阵,其中每个元素显示从场到另一个的距离。从逻辑上讲,它们是N行N个空格分隔的整数。从物理上讲,它们的长度限制为80个字符,因此有些行会继续使用其他行。当然,对角线将为0,因为从农场i到自身的距离对于这个问题并不感兴趣。
产量
    对于每种情况,输出一个整数长度,它是连接整组农场所需的最小光纤长度之和。
样本输入

    4
    0 4 9 21
    4 0 8 17
    9 8 0 16
    21 17 16 0

样本输出

    28

思路:该矩阵是农场和其他农场之间的距离,为0说明就是自己和自己的距离,求最小生成树即可,注意多组输入,否则wa

//
// Created by hanyu on 2019/8/1.
//
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#include<math.h>
using namespace std;
typedef long long ll;
const int maxn=2e7+7;
int father[maxn];
struct Node{
    int u,v,w;
    bool operator<(const Node &other)const{
        return this->w<other.w;
    }
}node[maxn];
int find(int x)
{
    if(x==father[x])
        return x;
    return father[x]=find(father[x]);
}
int main()
{
    int n;
    while(~scanf("%d",&n)) {
        int x;
        int book = 0;
        for (int i = 0; i <= n; i++)
            father[i] = i;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &x);
                if (x != 0) {
                    node[book].u = i;
                    node[book].v = j;
                    node[book++].w = x;
                }
            }
        }
        sort(node, node + book);
        int res = 0;
        int num = 0;
        for (int i = 0; i < book; i++) {
            int uu = find(node[i].u);
            int vv = find(node[i].v);
            if (uu == vv)
                continue;
            else {
                res += node[i].w;
                father[uu] = vv;
                num++;
                if (num == n - 1)
                    break;
            }
        }
        printf("%d
", res);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Vampire6/p/11282299.html