ARC076D-类切比雪夫距离最小生成树(水

题目大意:

二维平面上给n个点,定义两点的距离为: m i n ( ∣ x i − x j ∣ , ∣ y i − y j ∣ ) min(|x_i-x_j|,|y_i-y_j|) min(xixj,yiyj).问你最小生成树大小

题目思路:

假设只有一维,那么直接 m a x − m i n max-min maxmin即可.这里两个维度叠加之后,分别对 x , y x,y x,y排序,相邻点之间存边.最后对边排序后跑一遍kruskal即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
struct Node
{
    int x , y , id;
}a[maxn];
bool cmp1 (const Node & a , const Node & b){
    return a.x < b.x;
}
bool cmp2 (const Node & a , const Node & b){
    return a.y < b.y;
}
int f[maxn];
int getf (int x) {return x == f[x] ? x : f[x] = getf(f[x]);}
bool mer (int a , int b)
{
    int fa = getf(a) , fb = getf(b);
    if (fa == fb) return false;
    f[fb] = fa;
    return true;
}
struct Edge
{
    int u , v , w;
    bool operator < (const Edge & a)
    {
        return w < a.w;
    }
}e[maxn * 2];
int main()
{
    ios::sync_with_stdio(false);
    int n; cin >> n;
    for (int i = 1 ; i <= n ; i++){
        cin >> a[i].x >> a[i].y;
        a[i].id = i;
        f[i] = i;
    }
    int cnt = 0;
    sort(a + 1 , a + 1 + n , cmp1);
    for (int i = 1 ; i < n ; i++){
        e[++cnt].u = a[i].id;
        e[cnt].v = a[i + 1].id;
        e[cnt].w = a[i + 1].x - a[i].x;
    }
    sort(a + 1 , a + 1 + n , cmp2);
    for (int i = 1 ; i < n ; i++){
        e[++cnt].u = a[i].id;
        e[cnt].v = a[i + 1].id;
        e[cnt].w = a[i + 1].y - a[i].y;
    }
    sort(e + 1 , e + 1 + cnt);
    ll ans = 0;
    for (int i = 1 ; i <= cnt ; i++){
        if (mer(e[i].u , e[i].v)) ans += e[i].w;
    }
    cout << ans << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值