(板子) 最小生成树 买礼物 luogu P1194
懒得找最小生成树模板了,就把这题当板子吧。
最小生成树,就是指对于一张图,我们将图转换成一棵树,连通的,同时让所有的边尽可能的小(废话)。
最小生成树一般都采用Kruskal算法,期间需要用到并查集。大体思路如下:
先将所有边从小到大排序,对所有的节点维护并查集 f。
然后依次遍历所有的边,(当然是先从小的开始)。可以将并查集的 f 理解为缩点的类似操作。如果一条边的两个点
在同一个 f 中,则证明这两个点已经连通,不需要这条边(当然是前面通过别的小边已经连通了)。
因此,在从小到大遍历边的时候,如果两个点不在一个集合,就连这条边(因为他小)。
在同一个集合中,就不用画蛇添足了。
再看这道(没人权的)题,如果把每个物品当作点,那么价格就是边权。如果有优惠,我们当然选择买优惠的。(虽然这道题数据毒瘤,居然还有
优惠比原价高的情况,必须特判)
没有优惠,就连原价。反正最后都会经过最小生成树的筛选。
上板子代码:
#include <bits/stdc++.h>
using namespace std;
#define N 1000100
#define isdigit(c) ((c)>='0'&&(c)<='9')
#define orz 0 inline int read(){
int x = , s = ;
char c = getchar();
while(!isdigit(c)){
if(c == '-') s = -;
c = getchar();
}
while(isdigit(c)){
x = (x << ) + (x << ) + (c ^ '');
c = getchar();
}
return x * s;
} struct node{
int u, v, w;
} t[N];
int bian = ;
int fa[N];
int ans = ; int find(int x){
return x == fa[x] ? x : fa[x] = find(fa[x]);
} bool cmp (node a, node b){
return a.w < b.w;
} void kruskal(int pri, int n){
for(int i = ;i <= n; i++) fa[i] = i;
sort(t + , t + bian + , cmp);
for(int i = ;i <= bian; i++){
int u = t[i].u, v = t[i].v, w = t[i].w;
int fau = find(u), fav = find(v);
if(fau != fav){
fa[fau] = fav;
ans += (w < pri ? w : pri); /*毒瘤数据可能出现 w > pri 的情况,这种时候肯定选择 pri*/
}
}
return ;
} int main(){
// freopen("hh.txt", "r", stdin);
int pri = read(), n = read();
for(int i = ;i <= n; i++){
for(int j = ;j <= n; j++){
int x = read();
if(x != ){ /*注意给边去重!!*/
t[++bian].u = i;
t[bian].v = j;
t[bian].w = x;
}
}
}
kruskal(pri, n);
for(int i = ;i <= n; i++)
if(fa[i] == i)ans += pri; /*可能出现有的物品没有优惠或者是图中的第一个*/
printf("%d\n", ans);
return orz; /*向dalao低头*/
}
(板子) 最小生成树 买礼物 luogu P1194的更多相关文章
- 洛谷 P1194 买礼物 题解
P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买\(B\)样东西,巧的是,这\(B\)样东西价格都是\(A\)元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第II样东西 ...
- 洛谷——P1194 买礼物
P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只 ...
- P1194 买礼物(建模)
P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只 ...
- 洛谷 P1194 买礼物
洛谷 P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第II样东西,再买第J样,那么 ...
- 2017广东工业大学程序设计竞赛决赛-tmk买礼物
tmk买礼物 Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店 ...
- luogu P1194 买礼物
题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只花K[I,J]元,更 ...
- P1194 买礼物
题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只花K[I,J]元,更 ...
- P1194 买礼物 洛谷
https://www.luogu.org/problem/show?pid=1194 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近 ...
- 洛谷 P1194 【买礼物】
这道题其实就是转化一个模型就可以了. 买了一个另外一个又优惠,其实就相当于在优惠的时候连一条边,因为不可能多买,所以就是建一棵最小生成树.最后因为肯定买了一件物品,要加上最初的单价. 代码: #inc ...
随机推荐
- CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)
ACM思维题训练集合 The Little Elephant has two permutations a and b of length n, consisting of numbers from ...
- P1495 CRT,P4777 EXCRT
updata on 2020.4.11 修正了 excrt 的一处笔误 CRT 求解方程: \[\begin{cases} x \equiv a_1 \pmod {m_1}\\ x \equiv a_ ...
- YOLACT : 首个实时one-stage实例分割模型,29.8mAP/33.5fps | ICCV 2019
论文巧妙地基于one-stage目标检测算法提出实时实例分割算法YOLACT,整体的架构设计十分轻量,在速度和效果上面达到很好的trade-off. 来源:[晓飞的算法工程笔记] 公众号 论文: ...
- sprign mvc 解决中文乱码问题
解决get乱码问题 解决get请求的乱码需要在tomcat中解决,需要找到tomcat 的conf/server.xml: 解决post乱码问题 解决post乱码问题需要在spring 的主配置文件总 ...
- 第十章:Python高级编程-多线程、多进程和线程池编程
第十章:Python高级编程-多线程.多进程和线程池编程 Python3高级核心技术97讲 笔记 目录 第十章:Python高级编程-多线程.多进程和线程池编程 10.1 Python中的GIL 10 ...
- neo4j在docker容器环境中无法启动的问题
回去过了个周末,neo4j就无法启动了 数据还没备份出来,着急啊.上周回去前刚刚在研究怎么把数据导出来,尝试了一些容器导出的方法,没有成功.周一回来就无法启动了... 表现为启动后过几十秒又变为sto ...
- 今天主要做的是Remember Me(记住我)功能的实现
功能就是让网站登录过的人只要不注销,下次打开网站之后直接进入,不用重复登录,此功能主要是session与cookie的配合运用,具体实现是这样的,在登录页面判断并完成登录,然后将所需数据写入sessi ...
- k近邻法(二)
上一篇文章讲了k近邻法,以及使用kd树构造数据结构,使得提高最近邻点搜索效率,但是这在数据点N 远大于 2^n 时可以有效的降低算法复杂度,n为数据点的维度,否则,由于需要向上回溯比较距离,使得实际效 ...
- Java--ArrayList的遍历
三种遍历方式 一.for循环 二.for each 三.Iterator器遍历 Iterator it = list.iterator(); while(it.hasNext()){ syso(it. ...
- JDBC10 Blob二进制对象
//将图片输入到数据库中 // String sql="insert into t_user2 (username,headImg) values (?,?)"; // ps=co ...