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


    E - QS Network

    题目链接:

    https://vjudge.net/contest/66965#problem/E

    题目:

    在星系cgb的w-503行星中,有一种名为QS的智能生物。 QS通过网络相互通信。如果两个QS想要连接,他们需要购买两个网络适配器(每个QS一个)和一段网络电缆。请注意,一个网络适配器只能在单个连接中使用。(即,如果QS想要设置四个连接,则需要购买四个适配器)。在通信过程中,QS将其消息广播到它所连接的所有QS,接收消息的QS组将消息广播到它们所连接的所有QS,重复该过程直到所有QS都收到消息。

        示例如下所示:


        QS网络示例,QS A想要发送消息。

        步骤1. QS A向QS B和QS C发送消息;

        步骤2. QS B向QS A发送消息; QS C向QS A和QS D发送消息;

        步骤3.该过程终止,因为所有QS都收到了该消息。

        每个QS都有其优质的网络适配器品牌,并始终在其所有连接中购买该品牌。 QS之间的距离也不同。考虑到每个QS优先品牌的网络适配器的价格以及每对QS之间的电缆价格,您的任务是编写一个程序来确定设置QS网络的最低​​成本。


    输入

        输入的第一行包含一个整数t,表示数据集的数量。

        从第二行开始,有t个数据集。

        在单个数据集中,第1行包含一个表示QS数的整数n。

        第二行包含n个整数,表示每个QS最喜欢的网络适配器的价格。

        在第3行到第n + 2行包含一个矩阵,表示ecah对QS之间的电缆价格。

        限制:

        输入中的所有整数都是非负数且不超过1000。


    产量

        对于每个数据集,输出一行中的最小成本。不需要额外的空行。


    样本输入

        1
        3
        10 20 30
        0 100 200
        100 0 300
        200 300 0


    样本输出

        370

    思路:这道题要处理的东西比模板多一点,就是每个QS都有自己喜欢的适配器价格,然而两人之间需要有电缆,电缆也因人而异,

    所以以往的node[i].w+=x改成node[i].w+=x+a[i]+a[j],就是两者之间的适配器加上i->j和j->i之间的电缆价格就行了,主意数组要开大

    我用的2e5+10wa掉了,用的2e6+10就ac了

    //
    // Created by hy on 2019/7/30.
    //
    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <set>
    using namespace std;
    typedef long long ll;
    const int maxn=2e6+10;
    int father[maxn],a[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 T;
        int n;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(int i=0;i<=n;i++)
                father[i]=i;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
            }
            int p;
            int m=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                  scanf("%d",&p);
                  node[m].u=i;
                  node[m].v=j;
                  node[m++].w=p+a[i]+a[j];
                }
            }
            int sum=0;
            int cnt=0;
            sort(node,node+m);
            for(int i=0;i<m;i++)
            {
                int uu=find(node[i].u);
                int vv=find(node[i].v);
                if(uu==vv)
                    continue;
                else
                {
                    sum+=node[i].w;
                    father[uu]=vv;
                    cnt++;
                    if(cnt==n-1)
                        break;
                }
            }
            printf("%d
    ",sum);
        }
    
        return 0;
    }
  • 相关阅读:
    4 种高可用 RocketMQ 集群搭建方案!
    Spring @Autowired 注解自动注入流程是怎么样?
    AQS 自定义同步锁,挺难的!
    PyCharm爬虫实例:使用Scrapy抓取网页特定内容、数据采集与数据预处理--biaobiao88
    Ubuntu中安装Hadoop出现的问题
    Win10系统FF新推荐弹窗的卸载方法
    Sublime Text 中文乱码(解决)
    JProfiler的安装
    稀疏数组
    算法基础<一>
  • 原文地址:https://www.cnblogs.com/Vampire6/p/11273568.html
Copyright © 2020-2023  润新知