洛谷题单 <最小生成树> building roads

洛谷题单<最小生成树> 2
图片说明
图片说明
图片说明
krukal 的应用 题目告诉原有M条边 即修改M次并查集;考察对kruskal并查集的理解。
代码如下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1010, M = 1010;
struct edge{
    int a, b;
    double c;
    bool operator<(const edge& w){
        return c < w.c;
    }
}edges[N*N];//完全图 边数位N^2级别

int n, m, p[N], cnt;
long long px[N], py[N];

double get_len(int i,int j){
    long long x = (ll)(px[i] - px[j]) * (px[i] - px[j]);
    long long y = (ll)(py[i] - py[j]) * (py[i] - py[j]);

    return sqrt(x + y);
} 

int find(int x){
    if(x != p[x]) return p[x] = find(p[x]);
    else return x;
}

double kruskal(int cnt){
    sort(edges, edges + cnt);
    double res = 0;
    for(int i = 0;i < cnt; i++){
        int a = edges[i].a, b = edges[i].b;
        double c = edges[i].c;
        int x = find(a), y = find(b);
        if(x != y){
            p[x] = y;
            res += c;
        }
    } 
    return res;
} 

int main(){
    cin >> n >> m;
    for(int i = 0; i <= n; i++) p[i] = i;
    for(int i = 1; i <= n; i ++){
        int a, b;
        scanf("%d%d", &a, &b);
        px[i] = a, py[i] = b;
    }
    for(int i = 0; i < m; i++){
        int a, b;
        scanf("%d%d", &a, &b);
        int x = find(a), y = find(b);
        if(x != y) p[x] = y;
    }
    int cnt = 0; 
    for(int i = 1; i <= n; i++){    //建立完全图的边 
        for(int j = i + 1; j <= n; j++){
            double z = get_len(i, j);
            edges[cnt ++] = {i, j, z};
        }
    }

    double ans = kruskal(cnt); // 传入参数 :边数 

    printf("%.2f", ans);

    return 0;

}
全部评论

相关推荐

点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151604次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11203次浏览 101人参与
# 不去互联网可以去金融科技 #
20385次浏览 255人参与
# 和牛牛一起刷题打卡 #
18978次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203386次浏览 3627人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4972次浏览 30人参与
# OPPO开奖 #
19201次浏览 267人参与
# 通信硬件薪资爆料 #
265913次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2223次浏览 34人参与
# 互联网公司评价 #
97687次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25037次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454868次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53903次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14644次浏览 349人参与
# 硬件人的简历怎么写 #
82286次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19398次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28097次浏览 248人参与
# 学历对求职的影响 #
161239次浏览 1804人参与
# 你收到了团子的OC了吗 #
538722次浏览 6386人参与
# 你已经投递多少份简历了 #
344226次浏览 4963人参与
# 实习生应该准时下班吗 #
96977次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63524次浏览 622人参与
牛客网
牛客企业服务