蓝书(算法竞赛进阶指南)刷题记录——CH6201 走廊泼水节(最小生成树)

本文介绍了一种算法,用于解决将给定树扩充至完全图,且原树为该完全图唯一最小生成树的问题,同时计算扩充边的最小边权总和。通过Kruskal算法的变体,利用并查集合并树的联通块,巧妙计算出所有新增边的边权,最终得出最优解。

题目:CH6201.
题目大意:给定一棵 n n n个点的树,让你扩充成一张完全图,使得原树是这张完全图的唯一最小生成树,并输出加的边的最小边权和.
1 ≤ n ≤ 6000 1\leq n\leq 6000 1n6000,边权 ≤ 100 \leq 100 100,数据组数 ≤ 10 \leq 10 10.

这道题用了一个类似于Kruskal的东西,然后顺便计算出了最小边权和.

首先,我们将树拆开,将边排序,然后不断用并查集合并.

每合并一次,我们设合并的两个联通块为 x x x y y y,那么合并时就会 x x x y y y之间除了已有的这条边本身,其它边的边权都要大于已有的这条边.

而且我们可以发现,其它边的限制条件肯定只有大于这条边和比这条边小的树边,所以我们发现其它边的边权只要设成这条边的边权 + 1 +1 +1即可.

那么我们就kruskal的同时,每当加入一条边,就将答案加上其它的边的边权,我们发现其它边的数量即为 x x x的大小乘上 y y y的大小减 1 1 1,边权都为这条边的边权加 1 1 1.写成公式即为:
a n s = a n s + ( x . s i z e ∗ y . s i z e − 1 ) ∗ ( v [ i ] + 1 ) . ans=ans+(x.size*y.size-1)*(v[i]+1). ans=ans+(x.sizey.size1)(v[i]+1).

代码如下:

#include<bits/stdc++.h>
  using namespace std;
#define Abigail inline void
typedef long long LL;
const int N=6000;
struct side{
  int x,y,v;
  bool operator < (const side p)const{return v<p.v;}
}e[N+9];
int ans,n;
int fa[N+9],cnt[N+9];
int get(int u){return fa[u]=u^fa[u]?get(fa[u]):u;}
Abigail into(){
  scanf("%d",&n);
  for (int i=1;i<n;i++)
    scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].v);
}
Abigail work(){
  ans=0;
  for (int i=1;i<=n;i++) fa[i]=i,cnt[i]=1;
  stable_sort(e+1,e+n);
  for (int i=1;i<n;i++){
    ans+=(e[i].v+1)*(cnt[get(e[i].x)]*cnt[get(e[i].y)]-1);
    cnt[get(e[i].x)]+=cnt[get(e[i].y)];
    fa[get(e[i].y)]=get(e[i].x);
  }
}
Abigail outo(){
  printf("%d\n",ans);
}
int main(){
  int T;
  scanf("%d",&T);
  while (T--){
    into();
    work();
    outo();
  }
  return 0;
}
基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值