[eJOI2018]元素周期表
2024-09-03 18:18:10
\((r_1,c_1),(r_2,c_1),(r_1,c_2)\)三个格子存在就说明\((r_2,c_2)\)存在,如果我们将\(r_1,c_2,c_1,r_2\)都看成一些点的话,那么这个关系就非常类似于\(r_1\)和\(c_1\)联通,\(r_2\)和\(c_1\)联通,\(c_2\)和\(r_1\)联通,那么就说明\(r_2\)和\(c_2\)联通
于是我们将每个格子\((x,y)\)看成一些边,连接\(x\)行和\(y\)列,显然这张图是一个二分图,我们的目标就是将其补成一个完全二分图,即有\(n\times m\)条边
我们把已经有的\(q\)条边连上,发现我们不需要代价就能连的边都是在同一个联通块里的,我们补全所有不需要代价的边最多也只能把图补成几个完全二分图的子图
而同一个联通块内的边不需要代价,所以我们利用尽量少的边使得这张图完全联通就好了,显然需要连得边数就是联通块的个数\(-1\),并查集维护一下就好了
代码
#include<bits/stdc++.h>
#define re register
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=2e5+5;
int fa[maxn<<1],n,m,q;
inline int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void merge(int x,int y) {
int xx=find(x),yy=find(y);
if(xx==yy) return;fa[xx]=yy;
}
int main() {
n=read(),m=read(),q=read();
for(re int i=1;i<=n+m;++i) fa[i]=i;
for(re int x,y,i=1;i<=q;i++)
x=read(),y=read(),merge(x,y+n);
int ans=0;
for(re int i=1;i<=n+m;i++) if(find(i)==i) ans++;
printf("%d\n",ans-1);
return 0;
}
最新文章
- Linux下PHP的完全卸载
- Enterprise Solution 应用程序开发框架培训
- WIN10图标显示异常
- JQuery中$(document)是什么意思有什么作用
- [CareerCup] 12.6 Test an ATM 测试一个自动取款机
- 没有文件扩展";.js";的脚本引擎 解决办法
- WCF Rest:不使用UriTemplate使用post方式传参解决HTTP400问题以及参数映射问题
- Python之路第九天,高级(1)-网络编程
- Memcached 学习笔记(二)——ruby调用
- GitLab版本管理工具
- iOS页面切换动画实现方式。
- 使用genstring和NSLocalizedString实现App文本的本地化
- 智能指针之 unique_ptr
- .NET+MySql 踩坑1
- python笔记——遇到一些报错
- oracle SQL多表查询
- OO_多线程电梯_单元总结
- PMP:9.项目资源管理
- 10款 Mac 系统优化清理工具软件推荐和下载
- JMeter 提供了六种定时器
热门文章
- 互斥锁Demo
- 项目管理模式:外瀑布内敏捷(有人称为“信封法”)--转自知乎大神:CORNERSTONE
- jdk tomcat的项目版本一致操作
- jmeter 创建接口测试案例
- Linux Kernel Development有关内存管理
- package com.nps.base.xue.xd.groovyEngine import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.nps.common.service.NpsApplicationContextHolder import com.nps.data_api.service
- Day 20: 面向对象【多态,封装,反射】字符串模块导入/内置attr /包装 /授权
- 从零开始 Code Review,两年实战经验分享!
- python列表中enumerate和zip函数用法
- 从身份证号提取生日并更新到生日字段中的SQL语句