有意思的网格图转化。CF Div.1 还是挺有难度的。

注:由于本题有较完美的中文题面,所以不贴英文题面。

英文题面

题目描述

Innopolis 大学的教授正努力研究元素周期表。他们知道,有 \(n \times m\) 种元素,形成了一个 \(n\) 行 \(m\) 列的矩阵。

研究表明,如果元素周期表上有一个元素 A,且元素 B 与它在同一列(A 与 B 不能在同一周期),元素 C 在同一周期(A 与 C 不能在同一列),那么,科学家就可以用这三种元素通过核聚变合成第四种元素 D 的样品,D 与 B 在同一周期,与 C 在同一列。

简而言之,如果有在元素周期表中位置为 \((r_1, c_1),\ (r_1, c_2),\ (r_2, c_1)\) (其中 \(r_1\ne r_2,c_1\ne c_2\)​)的三种元素的样品,就可以生成位置为 \((r_2, c_2)\)) 的样品。如图所示:

注意:在核聚变中被使用的样品并不会消失,它们可以参与之后的反应;反应得到的样品也可以参与反应。

他们已经获得了 \(q\) 种元素的样品。为了集齐所有元素的样品,他们会购买一些样品,然后利用核聚变制造出剩下元素的样品。

请求出他们至少需要购买的元素样品的数量。

输入输出格式

输入格式:

第一行,\(3\) 个整数 \(n,m,q\ (1\le n,m\le 2\times 10^5, 0\le q\le\min \{n \times m, 2 \times 10^5\})\)。

之后的 \(q\) 行,每行 \(2\) 个整数 \(r_i, c_i\ (1\le r_i\le n,1\le c_i\le m)\)。保证给定的元素互不相同。

输出格式:

输出一个整数,表示至少需要购买的元素样品的数量。

输入输出样例

输入样例#1:

2 2 3
1 2
2 2
2 1

输出样例#1:

0

输入样例#2:

1 5 3
1 3
1 1
1 5

输出样例#2:

2

输入样例#3:

4 3 6
1 2
1 3
2 2
2 3
3 1
3 3

输出样例#3:

1

样例解释

说明

每个样例解释中有两个矩阵。
第一个表示初始状况(其中,打叉的是原本就有样品的元素)。
第二个表示最终集齐样品时的状况(其中,蓝圈代表核聚变得到的样品,蓝圈中的数字表示得到样品的顺序,红圈表示购买的样品)。

样例解释 1

通过给定的三种元素,可以得到第四种元素的样品。

样例解释 2

由于给定的元素只有一行,无法使用核聚变,只能购买剩余的两种元素的样品。

样例解释 3

集齐所有元素的方法不唯一,以下是一种方法。其中,元素 \((4,2)\) 只有在购买元素 \((4,1)\) 的样品,和反应得到元素 \((1,1)\) 的样品后才能得到。

子任务

注意:当且仅当你通过了一个子任务下的所有测试点,你将获得此子任务的分数。

子任务编号 分数 \(n\) \(m\) \(q\)
\(1\) \(10\) \(n=2\) \(m=2\) \(0\le q\le 4\)
\(2\) \(17\) \(1 \le n \le 2\) \(1 \le m \le 20\) \(0 \le q \le 20\)
\(3\) \(8\) \(1 \le n \le 20\) \(1 \le m \le 20\) \(q=0\)
\(4\) \(20\) \(1 \le n \le 20\) \(1 \le m \le 20\) \(0\le q \le 400\)
\(5\) \(30\) \(1 \le n \le 1 \times 10^4\) \(1 \le m \le 1 \times 10^4\) \(1 \le q \le 1 \times 10^5\)
\(6\) \(15\) \(1 \le n \le 2 \times 10^5\) \(1 \le m \le 2 \times 10^5\) \(1 \le q \le 2 \times 10^5\)

题解:

一开始总在找规律,比如先放没放过的行或列先把给出的元素全部聚变一遍……

实际上在这个网格图中,我们把每行、每列均抽象为一个点,可以看成是一个二分图,每个点连接了它的行和列。

那么当一对行、列连通而它们之间又没有直接连边时,可以通过它的路径生成同时在这一行且在这一列的那个点。因此不需要直接连边。

那么我们计算把整个二分图连通需要多少条边,就是连通块个数-1。

Code:

#include<cstdio>
#include<cstring>
struct edge
{int n,nxt;edge(int n,int nxt){this->n=n;this->nxt=nxt;}edge(){}
}e[400100];
int head[400100],ecnt=-1;
void add(int from,int to)
{e[++ecnt]=edge(to,head[from]);head[from]=ecnt;e[++ecnt]=edge(from,head[to]);head[to]=ecnt;
}
bool used[400100];
int dfs(int x)
{used[x]=1;for(int i=head[x];~i;i=e[i].nxt)if(!used[e[i].n])dfs(e[i].n);return 1;
}
int main()
{memset(head,-1,sizeof(head));int n,m,k,u,v;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=k;++i){scanf("%d%d",&u,&v);add(u,n+v);}int ans=0;for(int i=1;i<=n+m;++i)if(!used[i])ans+=dfs(i);printf("%d\n",ans-1);return 0;
}

转载于:https://www.cnblogs.com/wjyyy/p/cf1012b.html

CF1012B Chemical table 题解【二分图】【构造】相关推荐

  1. codeforces1012 B. Chemical table(并查集+思维)

    B. Chemical table One of the way to solve this problem is to interprete the cells in 2d matrix as an ...

  2. cf 1012B Chemical table

    思路: 对我这种新手来说挺难想到的并查集吧,好歹看了题解能明白了 每一行和每一列都看成并查集中的一个点,所以一共有n+m个点, 可以看出,只要一个矩形只要三个角上的点有共同的祖先,那么第四个点的x和y ...

  3. 图论(二分图构造) ---- 二分图的性质 C. Arpa’s overnight party and Mehrdad’s silent entering

    题目大意: 有 nnn 对情侣坐在 2n2n2n 个板凳上,板凳排成环形.每张凳子恰好坐一个人. 现在有两种食物分给他们.规定: 1.每对情侣中,俩人不能分到同一种食物: 2.环上任意三个相邻的人,不 ...

  4. CF - 741(C. Arpa’s overnight party and Mehrdad’s silent entering) 二分图构造

    题目链接 题意 已经给出情侣的座位编号,将两种饭分配给N对情侣.满足以下两个要求: 情侣之间不能吃相同的饭 座位号连续的三个人不能吃同一种饭 问是否存在满足的解. 思路 构造二分图 对应情侣的座位建边 ...

  5. 洛谷 P5089: CodeForces #500 (Div. 1) B / 1012B : Chemical table

    题目传送门:洛谷P5089. 题意简述: 一张 \(n \times m\) 的表格,有一些格子有标记,另外一些格子没有标记. 如果 \((r_1,c_1),(r_1,c_2),(r_2,c_1)\) ...

  6. Potato的暑期训练day#1题解 ——毒瘤构造

    Potato的暑期训练day#1 --毒瘤构造 题目链接: A.https://vjudge.net/problem/HDU-1214 B.https://vjudge.net/problem/Cod ...

  7. 2017 ccpc网络赛 1001 Vertex Cover(二分图 构造)HDU6150

    题意:"最小点覆盖集"是个NP完全问题 有一个近似算法是说-每次选取度数最大的点(如果有多个这样的点,则选择最后一个) 让你构造一个图,使得其近似算法求出来点数是你给定的覆盖点数的 ...

  8. CF1364D Ehab‘s Last Corollary(思维,环,二分图,构造)

    LINK 考虑一个环如果长大于等于 k k k,那么我们每次隔点取点,取出了 ⌈ k 2 ⌉ \lceil \frac{k}{2}\rceil ⌈2k​⌉个不相关点 当然,这个环必须是复杂环中的最小环 ...

  9. Chemical table CFR500 div2D(并查集)

    给定的一个n*m的区域内,给出一些点的坐标,这些点上有一个元素,如果在矩形的子矩形的三个点都有元素,那么第四个点的元素可以自己产生,其他的元素需要购买,问最少需要购买多少中元素才可以把这个区域给填满. ...

最新文章

  1. 2022-2028年中国轻型输送带行业市场发展规模及市场分析预测报告
  2. python20191031_20191031:Python取反运算详解
  3. 分布式系统概述(来自学习资料)
  4. zzuli 2525: 咕咕的搜索序列
  5. leetcode-- 338. Counting Bits
  6. python虚拟cpu性能_python实现可视化动态CPU性能监控
  7. python中列表和元组的相同点和不同点_详解Python语言中元组和列表的区别
  8. 集成学习之参数调整策略
  9. [工作积累] error: bad class file magic (cafebabe) or version (0033.0000)
  10. 简单介绍Javascript匿名函数和面向对象编程
  11. numpy与pandas基本使用
  12. 一起来看小米发布会!
  13. Java 入门之6:Java中的char类型是怎么存储的以及常见的编码字符集
  14. 12306 官网硬卧下铺的选择
  15. S7-200SMART案例分析——伺服接线(二)
  16. Cortex-M3 (NXP LPC1788)之外部中断操作
  17. c语言无法定位程序输入点,WinXP提示无法定位程序输入点于动态链接库上的快速解决办法...
  18. 孪生网络 应用_数字孪生照进现实,Unity如何打造数字世界的基础设施?
  19. 第三部分 :简单句的补充(复合句/定语从句)
  20. 2019.9.15训练总结

热门文章

  1. linux shell函数
  2. python3安装venv虚拟环境
  3. spark-jobserver介绍: 提供了一个 RESTful 接口来提交和管理 spark 的 jobs、jars 和 job contexts
  4. Scala使用半生对象来创建伴生类对象(默认单例)
  5. VMWare CentOS6.x克隆方法
  6. Python jsonpath库的使用:解析json并将结果保存到文件
  7. 请说明一下Spring中BeanFactory和ApplicationContext的区别是什么?
  8. Rabbitmq消息的Confirm确认机制
  9. 【软考-系统架构师】计算机操作系统相关考题答案详解
  10. Spring整合junit4实现对方法的测试