BZOJ 4883: [Lydsy1705月赛]棋盘上的守卫 最小生成树 + 建模
Description
Input
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;
}
BZOJ 4883: [Lydsy1705月赛]棋盘上的守卫 最小生成树 + 建模的更多相关文章
- bzoj 4883 [Lydsy1705月赛]棋盘上的守卫——并查集(思路!)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4883 把各行和各列看成n+m个点. 如果一下能防守行和列,就是最大匹配了.这是每两个左右部点 ...
- BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小环套树森林&优化定向问题)
4883: [Lydsy1705月赛]棋盘上的守卫 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 475 Solved: 259[Submit][St ...
- 【题解】BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小生成基环森林)
[题解]BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小生成基环森林) 神题 我的想法是,每行每列都要有匹配且一个点只能匹配一个,于是就把格点和每行每列建点出来做一个最小生成树,但是不 ...
- 【BZOJ4883】 [Lydsy1705月赛]棋盘上的守卫(最小生成树,基环树)
传送门 BZOJ Solution 考虑一下如果把行,列当成点,那么显然这个东西就是一个基环树对吧. 直接按照\(Kruscal\)那样子搞就好了. 代码实现 代码戳这里
- [BZOJ4883][Lydsy1705月赛]棋盘上的守卫[最小基环树森林]
题意 有一大小为 \(n*m\) 的棋盘,要在一些位置放置一些守卫,每个守卫只能保护当前行列之一,同时在每个格子放置守卫有一个代价 \(w\) ,问要使得所有格子都能够被保护,需要最少多少的代价. \ ...
- bzoj4883 [Lydsy1705月赛]棋盘上的守卫 最小生成基环树森林
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4883 题解 每一行和每一列都必须要被覆盖. 考虑对于每一行和每一列都建立一个点,一行和一列之间 ...
- [BZOJ4883][Lydsy1705月赛]棋盘上的守卫(Kruskal)
对每行每列分别建一个点,问题转为选n+m条边,并给每条边选一个点覆盖,使每个点都被覆盖.也就是最小生成环套树森林. 用和Kruskal一样的方法,将边从小到大排序,若一条边被选入后连通块仍然是一个环套 ...
- 【BZOJ4883】[Lydsy2017年5月月赛]棋盘上的守卫 KM算法
[BZOJ4883][Lydsy2017年5月月赛]棋盘上的守卫 Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须 ...
- bzoj 4880 [Lydsy1705月赛]排名的战争 贪心
[Lydsy1705月赛]排名的战争 Time Limit: 8 Sec Memory Limit: 256 MBSubmit: 338 Solved: 69[Submit][Status][Di ...
随机推荐
- 简述Vue中使用Vuex
1.为什么要用vuex 在vue组件通信的过程中,我们通信的目的往往就是在组件之间传递数据或组件的状态(这里将数据和状态统称为状态),进而更改状态.但可以看到如果我们通过最基本的方式来进行通信,一旦需 ...
- Sqlserver2012 sa账户登录添加其他账户
1.添加admin账户的设置 2.另外 sa登录后,点击服务器名,右键->属性->安全性 的设置: 3.其次是Sqlserver配置管理器,SQL Server服务需要重启: SQL Se ...
- sql回显注入-笔记
拼接sql命令查询数据 注释 常用于sql注入 # 井号 单行注释 注意:URL编码 %23 -- 两个减号加空格 单行注释 /* ...
- logging模块及日志框架
logging模块及日志框架 logging模块 一.导入方式 import logging 二.作用 写日志 三.模块功能 3.1 经常使用 # V1 import logging logging ...
- luogu P5371 [SNOI2019]纸牌
传送门 打麻将+1(雾 有顺子这种东西...注意到以某个位置为开头的顺子数量最多为2,那么有个想法就是枚举以每个位置为开头的顺子个数,然后每个位置的刻子的取法个数为\(\lceil\frac{\tex ...
- vscode如何使用?常用插件有哪些?
vscode下载 官网下载:https://code.visualstudio.com/ 一.汉化中文(官方下载默认为英文,英文好的小伙伴可直接跳过这步) 点击插件按钮搜索 Chinese, 在弹出的 ...
- NSUserDefaults的用法
NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefa ...
- [PyQt5]动态显示matplotlib作图(一)
完整实例 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePoli ...
- centos7 mysql 各种报错
1.重置root密码 vi /etc/my.cnf 添加skip-grant-tables service mysqld restart 2.mysql 登录 报错1 Unknown system v ...
- Inno setup 开源的安装包打包软件
Inno Setup是一个开源的安装包打包软件,下载地址是:http://www.jrsoftware.org/isdl.php 使用引导界面创建一个安装包打包 配置参考官方文档:http://www ...