bzoj 4883 [Lydsy1705月赛]棋盘上的守卫——并查集(思路!)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4883
把各行和各列看成n+m个点。
如果一下能防守行和列,就是最大匹配了。这是每两个左右部点需要一条边。
现在一行和一列都需要专门防守,其实可以看成每个点都需要一条边!
记录并查集内部已经有没有环,在连边的讨论一下即可。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int N=1e5+5; int n,m,xnt,fa[N]; ll ans; bool fx[N]; struct Ed{int x,y,w;Ed(int x=0,int y=0,int w=0):x(x),y(y),w(w) {}bool operator< (const Ed &b) const{return w<b.w;} }ed[N]; int rdn() {int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9') ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();return fx?ret:-ret; } void add(int x,int y,int z) {ed[++xnt]=Ed(x,y,z); } int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);} int main() {n=rdn(); m=rdn();for(int i=1;i<=n;i++)for(int j=1,w;j<=m;j++){w=rdn();add(i,j+n,w);}int d=n+m;for(int i=1;i<=d;i++) fa[i]=i;sort(ed+1,ed+xnt+1);for(int i=1,u,v;i<=xnt;i++){u=find(ed[i].x); v=find(ed[i].y);if(u!=v&&(fx[u]&fx[v])==0){fa[u]=v; fx[v]|=fx[u]; ans+=ed[i].w;}else if(u==v&&!fx[u]){fx[u]=1; ans+=ed[i].w;}}printf("%lld\n",ans);return 0; }
转载于:https://www.cnblogs.com/Narh/p/9700328.html
bzoj 4883 [Lydsy1705月赛]棋盘上的守卫——并查集(思路!)相关推荐
- bzoj 4883 [Lydsy1705月赛]棋盘上的守卫 题解(思维,建图,最小基环森林)
原题链接: bzoj 题意简述 一个 n ∗ m n*m n∗m的矩阵,要放 n + m n+m n+m个守卫,每个守卫只能守住所在行或所在列(只能选择一个).在 i , j i,j i,j位置上放守 ...
- bzoj4883 [Lydsy1705月赛]棋盘上的守卫 最小生成环套树森林
Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置 ...
- 最小生成基环森林--bzoj4883: [Lydsy1705月赛]棋盘上的守卫
传送门 solution: 左右两排点,i向j+n连w[i][j] 最小生成基环森林 每个边属于一个点,每个点占有一条边 用hv数组记录当前联通块里是否有环 如果这条边连的两点在一个联通块内,并且无环 ...
- [BZOJ4883][Lydsy1705月赛]棋盘上的守卫[最小基环树森林]
题意 有一大小为 \(n*m\) 的棋盘,要在一些位置放置一些守卫,每个守卫只能保护当前行列之一,同时在每个格子放置守卫有一个代价 \(w\) ,问要使得所有格子都能够被保护,需要最少多少的代价. \ ...
- bzoj 4880 [Lydsy1705月赛]排名的战争 贪心
[Lydsy1705月赛]排名的战争 Time Limit: 8 Sec Memory Limit: 256 MB Submit: 338 Solved: 69 [Submit][Status][ ...
- 【bzoj4883】[Lydsy2017年5月月赛]棋盘上的守卫 最小环套树森林
题目描述 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个 ...
- BZOJ 1015 [JSOI2008]星球大战starwar (逆序并查集)
BZOJ 1015 思路:并查集只有联边的作用,无法做到拆边,因此采取逆序做法.先将边拆掉,再用并查集进行联边,不同联通块相连则联通块数目减一. 1 #include<bits/stdc++.h ...
- BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...
- BZOJ4883: [Lydsy2017年5月月赛]棋盘上的守卫
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4883 Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须 ...
- bzoj 4886: [Lydsy2017年5月月赛]叠塔游戏 并查集
题意 小Q正在玩一个叠塔的游戏,游戏的目标是叠出尽可能高的塔.在游戏中,一共有n张矩形卡片,其中第i张卡片的长度为a_i,宽度为b_i.小Q需要把所有卡片按一定顺序叠成一座塔,要求对于任意一个矩形,它 ...
最新文章
- 干货,Wireshark使用技巧-过滤规则
- 软件项目经理新手上路9 - 谁是你的敌人?
- 算法设计与分析课程的时间空间复杂度
- linux安装jdk8_Skywalking系列博客1-安装单机版 Skywalking
- boost::fusion::move用法的测试程序
- 如何做好技术Team Leader
- 使用FiddlerCore来测试WebAPI
- Office Web Apps安装部署(一)
- 常用作业定义的T-SQL模板.sql
- html写弹出告警状态,基于日志报警插件 elastalert 实现告警(示例代码)
- Pytext简介:facebook的基于PyTorch的NLP框架
- 操作系统-UNIX三级索引技术
- Matlab------在Matlab中如何画圆
- node.js连接数据库写接口
- 有哪些免费的发布信息网站?
- android 第三方 im,Android基于环信SDK开发IM即时聊天
- 发送webService请求BPM流程
- AIGC能否助力三六零实现“戴维斯双击”?
- 应用系统如何与外部渠道进行对接?java代码实现篇
- 项目管理的五大过程组和十大知识领域