题目: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月赛]棋盘上的守卫——并查集(思路!)相关推荐

  1. bzoj 4883 [Lydsy1705月赛]棋盘上的守卫 题解(思维,建图,最小基环森林)

    原题链接: bzoj 题意简述 一个 n ∗ m n*m n∗m的矩阵,要放 n + m n+m n+m个守卫,每个守卫只能守住所在行或所在列(只能选择一个).在 i , j i,j i,j位置上放守 ...

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

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

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

    传送门 solution: 左右两排点,i向j+n连w[i][j] 最小生成基环森林 每个边属于一个点,每个点占有一条边 用hv数组记录当前联通块里是否有环 如果这条边连的两点在一个联通块内,并且无环 ...

  4. [BZOJ4883][Lydsy1705月赛]棋盘上的守卫[最小基环树森林]

    题意 有一大小为 \(n*m\) 的棋盘,要在一些位置放置一些守卫,每个守卫只能保护当前行列之一,同时在每个格子放置守卫有一个代价 \(w\) ,问要使得所有格子都能够被保护,需要最少多少的代价. \ ...

  5. bzoj 4880 [Lydsy1705月赛]排名的战争 贪心

    [Lydsy1705月赛]排名的战争 Time Limit: 8 Sec  Memory Limit: 256 MB Submit: 338  Solved: 69 [Submit][Status][ ...

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

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

  7. BZOJ 1015 [JSOI2008]星球大战starwar (逆序并查集)

    BZOJ 1015 思路:并查集只有联边的作用,无法做到拆边,因此采取逆序做法.先将边拆掉,再用并查集进行联边,不同联通块相连则联通块数目减一. 1 #include<bits/stdc++.h ...

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

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

  9. BZOJ4883: [Lydsy2017年5月月赛]棋盘上的守卫

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

  10. bzoj 4886: [Lydsy2017年5月月赛]叠塔游戏 并查集

    题意 小Q正在玩一个叠塔的游戏,游戏的目标是叠出尽可能高的塔.在游戏中,一共有n张矩形卡片,其中第i张卡片的长度为a_i,宽度为b_i.小Q需要把所有卡片按一定顺序叠成一座塔,要求对于任意一个矩形,它 ...

最新文章

  1. 干货,Wireshark使用技巧-过滤规则
  2. 软件项目经理新手上路9 - 谁是你的敌人?
  3. 算法设计与分析课程的时间空间复杂度
  4. linux安装jdk8_Skywalking系列博客1-安装单机版 Skywalking
  5. boost::fusion::move用法的测试程序
  6. 如何做好技术Team Leader
  7. 使用FiddlerCore来测试WebAPI
  8. Office Web Apps安装部署(一)
  9. 常用作业定义的T-SQL模板.sql
  10. html写弹出告警状态,基于日志报警插件 elastalert 实现告警(示例代码)
  11. Pytext简介:facebook的基于PyTorch的NLP框架
  12. 操作系统-UNIX三级索引技术
  13. Matlab------在Matlab中如何画圆
  14. node.js连接数据库写接口
  15. 有哪些免费的发布信息网站?
  16. android 第三方 im,Android基于环信SDK开发IM即时聊天
  17. 发送webService请求BPM流程
  18. AIGC能否助力三六零实现“戴维斯双击”?
  19. 应用系统如何与外部渠道进行对接?java代码实现篇
  20. 项目管理的五大过程组和十大知识领域

热门文章

  1. Spark深入浅出企业级最佳实践
  2. .net网页的生命周期列表
  3. .NET现成程序给你用[四]
  4. MySql BlackHole存储引擎
  5. 时间操作(Java版)—获取距离系统时间N天后的日期时间信息
  6. 项目运行报‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件“
  7. linux环境判断nginx是否已经启动
  8. linux怎么安装Nginx
  9. 解决响应式布局border带来的麻烦
  10. NuGet无法下载的问题