洛谷--买礼物

文章描述了一个关于生日礼物购买的问题,其中涉及到商品的价格和特定组合的优惠。通过构建图并应用kruskal算法,可以找到购买所有礼物的最低成本。这个问题是图论在实际生活中的应用,强调了如何通过算法优化购物策略。
摘要由CSDN通过智能技术生成

买礼物

题目描述

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

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

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

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

输入格式

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

接下来 B B B 行,每行 B B B 个数,第 I I I 行第 J J J 个为 K I , J K_{I,J} KI,J

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

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

输出格式

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

样例 #1

样例输入 #1

1 1
0

样例输出 #1

1

样例 #2

样例输入 #2

3 3
0 2 4
2 0 2
4 2 0

样例输出 #2

7

提示

样例解释 2 2 2

先买第 2 2 2 样东西,花费 3 3 3 元,接下来因为优惠,买 1 , 3 1,3 1,3 样都只要 2 2 2 元,共 7 7 7 元。

(同时满足多个“优惠”的时候,聪明的明明当然不会选择用 4 4 4 元买剩下那件,而选择用 2 2 2 元。)

数据规模

对于 30 % 30\% 30% 的数据, 1 ≤ B ≤ 10 1\le B\le 10 1B10

对于 100 % 100\% 100% 的数据, 1 ≤ B ≤ 500 , 0 ≤ A , K I , J ≤ 1000 1\le B\le500,0\le A,K_{I,J}\le1000 1B500,0A,KI,J1000

2018.7.25新添数据一组

题解

这是一个最小生成树与实际生活的一个结合应用,我们要注意题目给我们的信息,与现实生活结合,解决问题

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct node{
	int u,v,w;

}a[N];
int f[550];
int res;
int a1,b1;
int cnt;

bool cmp(node a,node b){
	return a.w<b.w;
}
int find(int x){
	if(f[x]==x){
		return x;
	}
	else{
		return f[x]=find(f[x]);
	}
}
void build(int x,int y,int z){
	a[++cnt].u=x;
	a[cnt].v=y;
	a[cnt].w=z;

}
void kruskal(){
	for(int i=1;i<=cnt;i++){
		auto it=a[i];
		int x=a[i].u;
		int y=a[i].v;
		int z=a[i].w;
		if(find(x)!=find(y)){
			f[find(x)]=f[find(y)];
			res+=z;
		}
	}
}
int main(){
	cin>>a1>>b1;
	for(int i=1;i<=b1;i++){
		for(int j=1;j<=b1;j++){
			int c;
			cin>>c;
			if(i<j&&c!=0){
				build(i,j,c);
			}
		}
	}
	for(int i=1;i<=b1;i++){
		f[i]=i;
	}
	for(int i=1;i<=b1;i++){
		build(0,i,a1);
	}//因为每件物品都想买,所以我们需要对每个物品都建一条边,那么0就是根
	sort(a+1,a+cnt+1,cmp);
	kruskal();

	cout<<res<<endl;
	return 0;

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值