问题

宇宙时间公元 5.55 亿年,由于某种原因两大联盟展开了激战(maxingc 联盟采用了微子技术):
邪恶的 maxingc 联盟采集好了微子能,就要运输。Maxingc 联盟的领袖 xc 此时才发现,自己的军事基地中
由微子发射器组成的微子能量网存在很大的问题,于是他决定修改。
之前,TT 为了整齐,把军事基地建成了矩形,而且如果两个微子发射器的连线平行于军事基地的一边,这
两个微子发射器之间就一定有微子能量传输线相连。
(*注:比如有 3 个微子发射器A(1,1)、B(1,3)、C(2,2),那么 A 和 B 之间有微子能量传输线相连,
A 和 B 不能传输到 C。*)
但是在微子能运输过程中发现,常常不能从一个微子发射器运抵另一个微子发射器。
为了可以从任何一个微子传输器能运抵其它任意一个微子传输器,而且能和原来的微子能量网同样整齐,
TT 决定遵循原来的规则,调动他的百万农奴新修建一些微子能量传输线和微子发射器。由于微子发射器的
造价比微子传输线高得多,所以 TT 决定忽略微子能量传输线的成本。
但是 TT 又不想花费不必要的钱,所以找到你为他计算最少需要建多少个微子发射器。
输入格式  Input Format
第一行三个正整数 n、m、p。(2<=n,m<=100000,表示军事基地的两边长;2<=p<=200000,表示微子

发射器的个数。)
接下来 p行,每行两个正整数数 Xi、 Yi(1<=Xi<=n   1<=Yi<=m),代表每个微子发射器在军事基地的位置。
(可能会由于疏漏,有些微子发射器重复)
输出格式  Output Format
样例:
 输入:5 6 6
1 1
2 2
2 4
3 3
5 1
5 5
输出:
2
只有一行,为最少修建微子发射器的数量。
样例的一种方案:
#.....
|#-#..
|.#+..
|.|...
#-+-#.
#表示原有微子发射器,-、|表示微子能量传输线,+表示兴建的微子发射器。所以至少兴建 2 个微子发射
器。

分析

我们先这样考虑,如果对所有已知的节点进行染色的话,能染成同一种颜色的节点一定在同一个强连通分量中(内部连同),那么需要兴建的节点数就等于强连通分量数减一

我们来证明这个结论:对于任意一个节点它可以照顾到一行一列上的所有节点。也就是说,一个节点最多可以连接到4个强连通分量。如果一个兴建的节点只连接一个强连通分量,那么这个节点是毫无用处的。如果一个节点连接3个强连同分量,那么这3个强连通分量必有两个已经在一个强连通分量中。连接4个同理。只有当一个节点连接两个强连通分量时,才能让这两个原先不连通的分量相互连同。

这就类似于最小生成树,将兴建的节点看成边,原有的强连通分量看做节点,那么n个节点连成一颗生成树必然需要n-1个节点。

下面的问题就是如何染色。

如果用floodfill会很复杂,而且显然会超时。我们要考虑更加优秀的的算法。我们现在需要将在一个强连通分量中的原节点赋予同一个标识,并查集!

再加一个标记数组(n+m 表示某行或某列上是否有节点)。每读入一个节点我们就将其所在的行和列和并在一个集合中。这样就将一个强连同分量中的所有行和列合并在了同一个集合中。

最后,只需要枚举每行(列),如果该行(列)被标记过(在某个强连通分量中),那么找到它的根节点,累计总数并且标记当前强连通分量被访问过(应用并查集压缩路径后在同一个集合中的元素的祖先相同),只需标记其祖先即可。

View Code

program liukeke;
var
f:array[1..400000] of longint;
v:array[1..400000] of boolean;
i,n,m,p,x,y,temp1,temp2,ans:longint;

function find(x:longint):longint;
begin
if f[x]=x then exit(x);
f[x]:=find(f[x]);
exit(f[x]);
end;

begin
assign(input,'wei.in');reset(input);
assign(output,'wei.out');rewrite(output);
readln(n,m,p);
for i:=1 to n+m do f[i]:=i;
for i:=1 to p do
begin
readln(x,y);
temp1:=find(x);
temp2:=find(y+n);
if temp1<>temp2 then
f[temp1]:=temp2;
v[x]:=true;
v[y+n]:=true;
end;
for i:=1 to n+m do
if v[i] then
begin
temp1:=find(i);
if v[temp1] then
begin
inc(ans);
v[temp1]:=false;
end;
end;
writeln(ans-1);
close(input);
close(output);
end.

反思

要先对题目分析,抽象其模型,再选取合适的数据结构解决问题,并查集应用不多但都很巧妙,可用来判断逻辑关系和集合关系

转载于:https://www.cnblogs.com/liukeke/archive/2011/06/12/2078972.html

【数据结构】量子危机相关推荐

  1. 数据结构(08)— 线性单链表基本操作

    1. 线性单链表数据结构 // 假定每个结点的类型用 SNode 表示 typedef struct SNodeTag {int data; // 所存储的数据元素SNodeTag *next; // ...

  2. 数据结构(06)— 线性循环链表实战

    1. 循环链表定义 单链的循环链表结点的存储结构和单链表的存储结构一样, 所不同的是: 最后一个结点的 next 域指向头结点, 而不是"空".这样, 由表尾很容易找到表头. 但若 ...

  3. 数据结构(05)— 线性单链表实战

    1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...

  4. 数据结构(04)— 线性顺序表实战

    1. 设计思路 本实战的实质是完成对学生成绩信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运 ...

  5. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)

    我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作:​ 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...

  6. 数据结构(02)— 时间复杂度与空间复杂度转换

    1. 时间复杂度转化为空间复杂度 常用的降低时间复杂度的方法有递归.二分法.排序算法.动态规划等,降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构. ​ ...

  7. OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)

    1. Vec 对象类型 Vec 是一个主要用于数值向量的模板类.我们可以定义向量的类型和组件的数量: Vec<double, 19> myVector 我们还可以使用任何的预定义类型: t ...

  8. 数据结构与算法——线性结构——线性表及其表示

    -"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...

  9. 队列:实用程序服务和数据结构

    队列:实用程序服务和数据结构 Queues: utility services and data structures 队列实用程序服务 Nucleus RTOS有四个API调用,它们提供与队列相关的 ...

最新文章

  1. 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
  2. pyspark使用ipython
  3. 【Java 并发编程】线程简介 ( 进程与线程 | 并发概念 | 线程间通信 | Java 并发 3 特性 )
  4. 海龟绘图画花朵_我家宝宝最喜欢的一本图画书——我的连衣裙
  5. 使用cocoapods
  6. c#: 协变和逆变深度解析
  7. JS学习--取整方法整理
  8. 2021年陕西高考成绩单招查询时间,2021年陕西高考录取结果什么时候出来,查询时间一览表...
  9. JAVA反射构建对象
  10. 修改mysql数据存放路径
  11. python中capitalize函数_python capitalize
  12. 科来网络分析工具基本操作与案例分析
  13. Solidworks或CAD怎样输出高质量图片?
  14. 【高德地图在React项目中的使用——(二)各种配置的使用】
  15. 山腰中的AMD,向前是唯一的选择
  16. in作为介词的用法_in的用法是什么,用于什么中
  17. Photoshop小技巧 (去掉照片中多余的人物)
  18. 想知道视频水印怎么去?推荐几个去视频水印的方法
  19. 我国成功研制EB级云存储系统:可满足大数据量存储落地需求
  20. mysql root密码是什么_mysql如何查看root密码是什么

热门文章

  1. ES6-13 正则方法、修饰符yus、UTF_16编码方式
  2. Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...
  3. 软件测试工具LoadRunner中如何定义SLA?--转载
  4. 关于二维码分块上色(彩色二维码)的算法研究
  5. kindeditor用法简单介绍(转)
  6. 【手势交互】9. PS Move
  7. 自然语言交流系统 phxnet团队 创新实训 项目博客 (五)
  8. PowerShell实现批量收集SCVMM中虚拟机IP-续
  9. 正则表达式(不断更新,欢迎纠错)
  10. AIX-vi操作-提示Unknown terminal type的问题解决方法