SSL2731 2017年9月16日提高组T2 学校联网(kruskal)

30 篇文章 0 订阅
12 篇文章 0 订阅

2017年9月16日提高组T2 A

Description

为了加快社会主义现代化,建设学校,小明决定给学校里每台电脑都连上互联网,方便未来随时随地玩耍。
他的电脑室很大,有N 台电脑,但地理位置偏僻,网络信号很差。
一台电脑有网,当且仅当满足以下至少一个条件:
1、给中国移动交宽带费,直接连网,花费为A。
2、向另外一台有网的电脑,安装共享网线,花费为B×两者曼哈顿距离。
现在,小明已经统计出了所有电脑的坐标。他想知道最少要多少费用才能达到目的。

Input

第一行:三个正整数,代表N、A、B。
接下来N 行:每行两个整数Xi、Yi,第i 行代表第i 台电脑的坐标。

Output

第一行:一个整数,代表答案

分析:把所有边连起来做最小生成树,如果当前边权大于A就去掉这条边。

代码

#include <cstdio>
#include <algorithm>
#include <cmath>
#define maxn 2000000
using namespace std;

struct arr
{
    int p,q,w;
}a[maxn];
int x[maxn],y[maxn],f[maxn],n,A,B,dis;
bool v[maxn];

int mhd(int i,int j)
{
    return (abs(x[i]-x[j])+abs(y[i]-y[j]))*B;
}

int so(arr x1,arr x2)
{
    return x1.w<x2.w;
}

int find(int x)
{
    if (f[x]==x) return x;
    f[x]=find(f[x]);
    return f[x];
}

int main()
{
    scanf("%d%d%d",&n,&A,&B);
    for (int i=1;i<=n;i++)
        scanf("%d%d",&x[i],&y[i]);
    int l=0;
    for (int i=1;i<=n;i++)
        for (int j=i+1;j<=n;j++)
            {
                a[++l].p=i;
                a[l].q=j;
                a[l].w=mhd(i,j);
            }
    sort(a+1,a+l+1,so);
    for (int i=1;i<=l;i++)
        f[i]=i;
    for (int i=1;i<=l;i++)
    {
        int u=find(a[i].p);
        int t=find(a[i].q);
        if (u!=t) 
        {
            f[u]=t;
            dis+=min(a[i].w,A);
        }
    }

    printf("%d",dis+A);
    fclose(stdin);
    fclose(stdout);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值