题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4883

Description

在一个n*m的棋盘上要放置若干个守卫。对于n行来说,每行必须恰好放置一个横向守卫;同理对于m列来说,每列
必须恰好放置一个纵向守卫。每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个守卫,一个守卫
不能同时兼顾行列的防御。请计算控制整个棋盘的最小代价。

Input

第一行包含两个正整数n,m(2<=n,m<=100000,n*m<=100000),分别表示棋盘的行数与列数。
接下来n行,每行m个正整数
其中第i行第j列的数w[i][j](1<=w[i][j]<=10^9)表示在第i行第j列放置守卫的代价。

Output

输出一行一个整数,即占领棋盘的最小代价。

Sample Input

3 4
1 3 10 8
2 1 9 2
6 7 4 6

Sample Output

19

HINT
在(1,1),(2,2),(3,1)放置横向守卫,在(2,1),(1,2),(3,3),(2,4)放置纵向守卫。

将每行看成一个点,每列也看成一个点,在第 i 行与第j 列之间连一条边权为 w[i][j] 的边,那么就得到了一个n + m 个点的图。

根据题目的限制,对于任意 n 个点的集合,都只能最多选择n 条边。因此在最后方案里,这个图是若干个连通块,每个连通块是树或者是环套树。

那么问题就转化为了最小生成环套树森林,Kruskal 即可。时间复杂度O(nm log(nm))。

//最小生成环套树森林
#include<cstdio>
#include<algorithm>
const int N=100010;
int n,m,i,j,z,x,y,cnt,f[N],v[N];long long ans;
struct E{int x,y,z;E(){}E(int _x,int _y,int _z){x=_x,y=_y,z=_z;}}e[N];
inline bool cmp(const E&a,const E&b){return a.z<b.z;}
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
int main(){scanf("%d%d",&n,&m);for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&z),e[++cnt]=E(i,j+n,z);std::sort(e+1,e+cnt+1,cmp);for(i=1;i<=n+m;i++)f[i]=i;for(i=1;i<=cnt;i++){x=F(e[i].x),y=F(e[i].y);if(v[x]&&v[y])continue;if(x!=y)v[y]|=v[x],f[f[x]]=f[y];else v[x]=1;ans+=e[i].z;}return printf("%lld",ans),0;
}

BZOJ4883: [Lydsy2017年5月月赛]棋盘上的守卫相关推荐

  1. 【bzoj4883】[Lydsy2017年5月月赛]棋盘上的守卫 最小环套树森林

    题目描述 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个 ...

  2. BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...

  3. bzoj4883 [Lydsy1705月赛]棋盘上的守卫 最小生成环套树森林

    Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置 ...

  4. 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp

    打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并 ...

  5. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set

    题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...

  6. Lydsy2017年4月月赛 抵制克苏恩

    Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩 炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一个游戏, 每个玩家拥有一个 ...

  7. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你 ...

  8. [bzoj4881][Lydsy2017年5月月赛]线段游戏

    来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...

  9. BZOJ4832: [Lydsy2017年4月月赛]抵制克苏恩

    传送门 题目大意: 攻击k次,每次可攻击随从或英雄. 随从数不大于7个,且1滴血的a个,2滴b个,3滴c个. 攻击一次血-1,如果随从没死可以生成3滴血随从一个 题解: 概率/期望dp f[i][j] ...

最新文章

  1. Ubuntu中基于QT的系统网线连接状态的实时监视
  2. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)
  3. GCB | 南土所冯有智组揭示了温度非线性的控制了全球土壤腐生真菌地理学分布...
  4. 网站性能测试指标(QPS,TPS,吞吐量,响应时间)详解
  5. POJ2817 WordStack(状压DP)
  6. linux重启网络服务_vm上linux虚拟机NAT模式配置
  7. linux ubuntu20.04 problems
  8. php商品秒杀时间代码,Thinkphp5+Redis实现商品秒杀代码实例讲解
  9. 破解版果冻手机动画主题for WM5 WM6
  10. 「ZigBee模块」基础实验(2)按键
  11. 可逆矩阵性质总结_逆矩阵的定义与性质.doc
  12. 如何计算加权和及矩阵乘法运算回顾
  13. 系统性谈谈软件可靠性——第4讲:软件可靠性测试
  14. wps表格打印怎么铺满a4纸
  15. Jekyll 学习笔记
  16. nopi word to html,C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)...
  17. Hbuilder中如何快速输入注释标签_vscode中20个让人眼前一亮的插件
  18. poi word设置字体背景颜色(也叫底纹)
  19. 二叉树的前序,中序,后续(非递归版本)
  20. java工作空间报错,java更改工作空间后报错

热门文章

  1. jq js100vh做减法算法
  2. c++ advanced (2) details about default member functions
  3. 零基础学简笔画 | 少女的头发这样画!
  4. RabbitMQ的死信队列
  5. vue 项目移动端 PC端自适应
  6. 高通骁龙210系列-MSM8909核心板
  7. 制作Python,Raspberry Pi,电机和传感器版无线控制漫游车
  8. 开学季选哪个蓝牙耳机好?2022年好用的平价蓝牙耳机推荐
  9. jquery简单多图片前后滚动插件
  10. ERROR:frozen importlib._bootstrap, line 1519, in _find_and_load_unlocked