ad1 广告
 
收藏文章 楼主

洛谷P1194:促销策略下的最优购物方案 最小生成树应用

版块:文章资讯   类型:普通   作者:用意要   查看:22   回复:0   获赞:0   时间:2025-07-13 15:12:07

截图未命名.jpg 洛谷P1194:促销策略下的最优购物方案 最小生成树应用 最小生成树 Kruskal算法 促销策略 图论应用 并查集 贪心算法 洛谷P1194 第1张

一、问题分析

题目描述了一个促销场景:购买B件相同价格A元的商品,但购买特定组合(I,J)时可以享受优惠价K_{I,J}。我们需要计算购买所有商品的最小总花费。

二、算法选择

这个问题可以转化为图论中的最小生成树问题:

  1. 将每件商品视为中的一个节点

  2. 优惠价格K_{I,J}视为节点I和J之间的边权

  3. 添加一个虚拟节点0,连接到所有商品节点,边权为A

这样,原问题就转化为在这个图中找最小生成树,总权重即为最小花费。

三、C++代码实现

#include <iostream>
#include <vector>
#include <algorithm>
using namespACe std;

struct Edge {
    int u, v, w;
    bool operator<(const Edge& other) const {
        return w < other.w;
    }
};

vector<int> parent;

int find(int x) {
    return parent[x] == x ? x : parent[x] = find(parent[x]);
}

int main() {
    int A, B;
    cin >> A >> B;
    
    vector<Edge> edges;
    
    // 添加虚拟节点0到各商品的边
    for (int i = 1; i <= B; ++i) {
        edges.push_back({0, i, A});
    }
    
    // 读入优惠价格
    for (int i = 1; i <= B; ++i) {
        for (int j = 1; j <= B; ++j) {
            int k;
            cin >> k;
            if (i < j && k != 0) {  // 避免重复添加
                edges.push_back({i, j, k});
            }
        }
    }
    
    // Kruskal算法准备
    sort(edges.begin(), edges.end());
    parent.resize(B + 1);
    for (int i = 0; i <= B; ++i) parent[i] = i;
    
    int total = 0, count = 0;
    for (auto& e : edges) {
        int rootU = find(e.u);
        int rootV = find(e.v);
        if (rootU != rootV) {
            parent[rootV] = rootU;
            total += e.w;
            if (++count == B) break;  // 生成树有B条边
        }
    }
    
    cout << total << endl;
    return 0;
}

四、代码解析

  1. 数据结构:使用Edge结构体存储边信息

  2. 虚拟节点:节点0代表不适用任何优惠的原始购买方式

  3. 并查集:用于高效判断环的存在

  4. Kruskal算法:按边权排序贪心选择最小边

来源:编程学习

 
ad1 广告位8,870 x auto
回复列表
默认   热门   正序   倒序

回复:洛谷P1194:促销策略下的最优购物方案 最小生成树应用

Powered by 免费外链论坛

©2015 - 2025 免费外链论坛

免费外链论坛 免费发布外链 发外链平台Sitemap

您的IP:216.73.216.202,2025-08-03 03:17:22,Processed in 0.02772 second(s).

备案信息:浙ICP备2024090696号

声明:本站内容为用户自主发布,不对其内容真实性负责,虽然本站会一一审核,但能力有限,如您发现违规内容,请及时联系管理员。

主页

欢迎您的浏览

QQ联系图标

自助查询

99%的问题都能找到答案

联系站长

工作时间:9:00~17:30

微信二维码

回到顶部

向上滚动到顶部

个人中心

去个人首页看看吧

转到底部

向下滚动到底部

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息