题目链接:https://www.luogu.com.cn/problem/P3101

Slove

这题我们可以尝试建立一个图。

以相邻的两个点建边,边的权值为两个点高度差的绝对值,然后把边按照边权值从小到大排序。

然后就可以愉快地使用并查集了:

一开始将每一个点划分到自己的集合。

每次枚举一条边,判断所枚举的边的两个点是否在同一个集合内,如果在就不管,不在就将这两个节点所处的集合进行合并。

每枚举一条边,如果发现合并后的集合点数已经不少于t个,且合并前有集合的点数小于t,如果以前这个集合里面包含终点,答案就直接加上当前边的权值就好了。

每次集合合并时需要合并的信息有集合大小和集合中是否含起点

Code

#include<bits/stdc++.h>
using namespace std;
struct bian
{
int a,b;
long long c;
}s[1000000];
int cmp(bian xx1,bian xx2)
{
if(xx1.c!=xx2.c)return xx1.c<xx2.c;
else
{
if(xx1.a!=xx2.a)return xx1.a<xx2.a;
else return xx1.b<xx2.b;
}
}
int m,n,t,bcj[1000000],tot=0,lll;
long long mm[1000][1000],num[1000000],siz[1000000],ans=0;
int find(int x)//并查集-找祖宗
{
int zz;
if(bcj[x]==x)zz=x;
else zz=find(bcj[x]);
bcj[x]=zz;
return zz;
}
int main()
{
scanf("%d%d%d",&m,&n,&t);
for(int i=1;i<=m*n*3;i++)bcj[i]=i,siz[i]=1;//预处理
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)cin>>mm[i][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(i!=1)s[++tot].a=(i-1)*n+j,s[tot].b=(i-2)*n+j,s[tot].c=abs(mm[i][j]-mm[i-1][j]);
if(j!=1)s[++tot].a=(i-1)*n+j,s[tot].b=(i-1)*n+j-1,s[tot].c=abs(mm[i][j]-mm[i][j-1]);
}
//建边
sort(s+1,s+tot+1,cmp);//排序
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&lll);
if(lll==1)num[(i-1)*n+j]=1;//给起点打上标记(第i行第j列的点编号为((i-1)*n+j))
}
for(int i=1;i<=tot;i++)
{
int fa=find(s[i].a),fb=find(s[i].b);
if(fa==fb)continue;//在同一个集合中
if(siz[fa]+siz[fb]>=t)//判断集合是否满足条件
{
if(siz[fa]<t)ans+=s[i].c*num[fa];
if(siz[fb]<t)ans+=s[i].c*num[fb];
}
num[fa]+=num[fb],siz[fa]+=siz[fb],bcj[fb]=fa;//合并信息
}
cout<<ans<<endl; return 0;
}

最新文章

  1. hibernate 多表查询
  2. Canvas之蛋疼的正方体绘制体验
  3. linux下vim如何配置markdown插件
  4. TextEdit 回车事件
  5. SequoiaDB 系列之六 :源码分析之coord节点
  6. iOS视频录制、压缩导出、取帧
  7. 补丁安装命令(WUSA)
  8. Jsp中response对象的所有属性
  9. Java 学习第一天
  10. Egret --视觉编程,显示对象,事件
  11. WebGL 创建和初始化着色器过程
  12. kotlin 语言入门指南一
  13. Ubuntu 18.04 启动root账号并授权远程登录
  14. 2018-2019-2 网络对抗技术 20165305 Exp2 后门原理与实践
  15. Java的MVC模式简介
  16. Laravel表单传值
  17. [算法]和为S的两个数字
  18. Android7.0 PowerManagerService 之亮灭屏(二) PMS 电源状态管理updatePowerStateLocked()
  19. Future Works on P4
  20. Hive安装与配置——深入浅出学Hive

热门文章

  1. swoole热启动
  2. centos下安装mongodb 通过shell脚本
  3. Spring Boot 整合多点套路,少走点弯路~
  4. 第三章 虚拟机的简单使用及其xshell远程工具的使用
  5. D - 活动选择
  6. Docker学习笔记之-在虚拟机VM上安装CentOS 7.8
  7. VMware Workstatition启动虚拟机电脑蓝屏
  8. Ubuntu使用mail命令发送邮件
  9. Spring Boot 学习摘要--关于配置
  10. Qlik Sense学习笔记之Mashup开发(一)