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

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

每个行和每个列至少都要有一个守卫只对它起贡献.

而每个首位有可能对这个行/这个列起贡献,很难直接决策应该贡献给哪个

我们发现这其实是一个基环树森林(将行和列的编号看成点),因为每个点要对应唯一的一条边

跑一遍 kruskal 即可

#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
const int maxn=200003;
namespace IO {
inline void setIO(string s) {
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
};
struct Edge {
int u,v;
ll c;
}ed[maxn];
bool cmp(Edge a,Edge b) {
return a.c < b.c;
}
int p[maxn],tag[maxn];
int find(int x) {
return p[x]==x?x:p[x]=find(p[x]);
}
int main() {
// IO::setIO("input");
int n,m,i,j,edges=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n+m+1;++i) p[i]=i;
for(i=1;i<=n;++i) for(j=1;j<=m;++j) {
++edges;
scanf("%lld",&ed[edges].c),ed[edges].u=i,ed[edges].v=j+n;
}
sort(ed+1,ed+1+edges,cmp);
ll ans=0;
for(i=1;i<=edges;++i) {
int x=ed[i].u,y=ed[i].v;
ll val=ed[i].c;
x=find(x),y=find(y);
if(x==y && !tag[x]) tag[x]=1, ans+=val;
else if(x!=y&&(!tag[x]||!tag[y])) ans+=val, p[x]=y, tag[y]|=tag[x];
}
printf("%lld\n",ans);
return 0;
}

  

最新文章

  1. iOS 调试工具
  2. 学习ES6生成器(Generator)
  3. 【PHP绘图技术&amp;&amp;验证码绘制】
  4. HTML编程
  5. 解决SSH无密码登陆后又需要密码登陆
  6. Java中String类型的不可变性和驻留池
  7. sublime中文乱码
  8. MySQL事务隔离级别初探
  9. java编程思想-注解思维导图
  10. UltraISO制作U盘系统安装盘(图文教程)
  11. 解决No Hibernate Session bound to thread, and configuration does not allow creat。。。
  12. ORA-00923: 未找到要求的 FROM 关键字
  13. docker安装方法(常见安装出错问题汇总)
  14. [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库
  15. 牛客 小a与星际探索 bfs
  16. 从统计局采集最新的省市区镇数据,用js在浏览器中运行 V2
  17. 指数型生成函数(EGF)学习笔记
  18. Kettle (5) - 获取 Web 数据
  19. odoo开发笔记 -- 后台日志输出及分析
  20. 从 Secure Element 到 Android KeyStore

热门文章

  1. tableau分布式添加节点
  2. Spring MVC 中使用AOP 进行事务管理--XML配置实现
  3. [转帖]vim搜索及高亮取消
  4. python调用jenkinsapi
  5. 教你用 Netty 实现一个简单的 RPC!
  6. 存储过程实例基于postgersql
  7. C++的左值,右值,左值引用,右值引用
  8. PyQt5_主要的类库
  9. MUI沉浸式代码
  10. .net 分布式锁