当前位置: 首页 > article >正文

蓝桥杯真题 - 缴纳过路费 - 题解

题目链接:https://www.lanqiao.cn/problems/19736/learning/

个人评价:难度 2 星(满星:5)
前置知识:并查集


整体思路

  • 按边权从小到大处理,将处理过的边的两个端点合入一个并查集中;
  • 由此,在处理到第 i i i 条边时,如果边的两个端点不在并查集中,那么这两个端点各自在的并查集中所有端点,都必须经过这条边才能到达对面的端点,所以该边两端所有点之间的“最贵”收费就是这条边的权值,因此如果该边权值在区间 [ L , R ] [L, R] [L,R] 内,那么这条边对答案的贡献就是两边并查集节点数的乘积。

过题代码

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int maxn = 200000 + 100;
struct Edge {
    int u, v, w;
    Edge() {}
    Edge(int u, int v, int w): u(u), v(v), w(w) {}
};

bool operator<(const Edge &a, const Edge &b) {
    return a.w < b.w;
}

int n, m, l, r, u, v, w;
LL ans;
int fa[maxn], num[maxn];
Edge edge[maxn];

void init() {
    for (int i = 1; i <= n; ++i) {
        fa[i] = i;
        num[i] = 1;
    }
}

int findF(int x) {
    return x == fa[x] ? x : fa[x] = findF(fa[x]);
}

void union_(int x, int y) {
    x = findF(x);
    y = findF(y);
    if (x != y) {
        fa[x] = y;
        num[y] += num[x];
    }
}

int main() {
#ifdef ExRoc
    freopen("test.txt", "r", stdin);
#endif // ExRoc
    ios::sync_with_stdio(false);

    cin >> n >> m >> l >> r;
    init();
    for (int i = 1; i <= m; ++i) {
        cin >> edge[i].u >> edge[i].v >> edge[i].w;
    }
    sort(edge + 1, edge + 1 + m);
    for (int i = 1; i <= m; ++i) {
        u = findF(edge[i].u);
        v = findF(edge[i].v);
        w = edge[i].w;
        if (w >= l && w <= r && u != v) {
            ans += num[u] * num[v];
        }
        union_(u, v);
    }
    cout << ans << endl;

    return 0;
}

http://www.kler.cn/a/557209.html

相关文章:

  • 氧化锆(化学式ZrO₂)在多个工业领域发挥重要作用京煌科技
  • 机器学习 - 投票感知器
  • VUE四:Vue-cli
  • Android 中 如何监控 某个磁盘有哪些进程或线程在持续的读写
  • 【WebGL】fbo双pass案例
  • SpringAI系列 - ToolCalling篇(二) - 如何设置应用侧工具参数ToolContext(有坑)
  • hot100-滑动窗口
  • ctfshow——phps源码泄露
  • Tio-Boot 集成 Spring Boot 实现即时通讯功能全解析
  • 深度学习图像预处理可视化:拆解Compose操作的全过程
  • Java集合框架(知识整理)
  • ipad连接电脑断断续续,不断弹窗的解决办法
  • CNewMenu::QueryContextMenu函数分析之新建菜单项的创建
  • 企业内容中台搭建实战手册
  • 如何成为一名合格的单片机工程师----引言介绍篇(1)
  • C++面试题,进程和线程方面(1)
  • 【Git】五、多人协作
  • 041集——封装之:新建图层(CAD—C#二次开发入门)
  • 新学一个JavaScript 的 classList API
  • win11系统无法打开软件_组策略无法打开_gpedit.msc不生效_为了对电脑进行保护,已经阻止此应用---Windows工作笔记057