寒假算法题打卡:

题目描述

又到了一年一度的明明生日了,明明想要买 BB 样东西,巧的是,这 BB 样东西价格都是 AA 元。

但是,商店老板说最近有促销活动,也就是:

如果你买了第 II 样东西,再买第 JJ 样,那么就可以只花 K_{I,J}KI,J​ 元,更巧的是,K_{I,J}KI,J​ 竟然等于 K_{J,I}KJ,I​。

现在明明想知道,他最少要花多少钱。

输入格式

第一行两个整数,A,BA,B。

接下来 BB 行,每行 BB 个数,第 II 行第 JJ 个为 K_{I,J}KI,J​。

我们保证 K_{I,J}=K_{J,I}KI,J​=KJ,I​ 并且 K_{I,I}=0KI,I​=0。

特别的,如果 K_{I,J}=0KI,J​=0,那么表示这两样东西之间不会导致优惠。

输出格式

一个整数,为最小要花的钱数。

代码传送门

分析为什么用Kruskal算法。

该题目中,有两顶点(两点之间不分顺序,即没有方向),且两顶点之间有数值(而且自己到自己数值为0),可以看做为无向图之间,数值为权值,需要求出最大的优惠价格类似于找出权值最小的通道的最小生成树。该类型模式可以用最小生成树Kruskal算法做。

先是生成一个无向图,为了得到最少的价钱,那么求出开始运用到最小生成树(先是将权值从小到大的排序一遍,将其一个个取出,判断是否形成环,如果不形成环,那就将权值进行相加。最终就会得到最小生成树,即得到最大的优惠价格)

但是注意到一个问题,优惠价格有可能大于原本的价钱,所以到最后输出价格的时候,与原来的价格进行对比再输出(细节)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值