合纵连横

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述

乱世天下,诸侯割据。每个诸侯王都有一片自己的领土。但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大。而实力弱的诸侯王为了不让自己的领土被吞并,他会联合一些其他同样弱小的诸侯国,组成联盟(联盟不止一个),来共同抵抗那些强大的诸侯国。 强大的诸侯国为了瓦解这些联盟,派出了最优秀的间谍来离间他们,使一些诸侯国退出联盟。最开始,每个诸侯国是一个联盟。

有两种操作

1、U x y 表示x和y在同一个联盟。(0≤x,y<n)

2、D x   表示x退出联盟。

 
输入
多组测试数据
第一行两个数,n和m(1 ≤ n≤ 10^5, 1 ≤ m ≤10^5),分别表示诸侯国的个数和操作次数。
接下来有m行操作
输出
输出联盟的个数
样例输入
  1. 5 7
  2. U 0 1
  3. U 1 2
  4. U 0 3
  5. D 0
  6. U 1 4
  7. D 2
  8. U 0 2
  9. 10 1
  10. U 0 9
样例输出
  1. Case #1: 2
  2. Case #2: 9
  1. /**
  2. 分析:主要考察并查集中点的删除
  3. 算法:
  4. Ⅰ、以前并查集是以其 1 - n 中的元素即作根节点又作子节点
    《这样删除 pre [a] = n ++; 的话会使原先在一个区域的点可能不在一个区域了》
  5. Ⅱ、现在我们将所有 1 - n 中的点作为子节点,n - 2n 的点作为根节点
  6. 《这样我们删除 pre [a] = 2n ++;的时候就不会打乱以前已在一个区域的点》
  7. Ⅲ、其中 my_find()、my_join() 与以前并查集模板一致
  8.  
  9. 关键代码:
  10. void init () {
  11. for (int i = 0; i < n; ++ i)
  12. pre [i] = i + n;
  13. for (int i = n; i < 2*n + m; ++ i)
  14. pre [i] = i;
  15. pos = 2*n;
  16. return ;
  17. ]
  18. **/

C/C++代码实现(AC):

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int n, m, pre [], pos;
  6.  
  7. void init () {
  8. for (int i = ; i < n; ++ i)
  9. pre [i] = i + n;
  10. for (int i = n; i < n + n + m; ++ i)
  11. pre [i] = i;
  12. pos = n + n;
  13. return ;
  14. }
  15.  
  16. int my_find (int x) {
  17. int n1 = x;
  18. while (n1 != pre [n1]) {
  19. n1 = pre [n1];
  20. }
  21. int i = x, j;
  22. while (pre [i] != n1) {
  23. j = pre [i];
  24. pre [i] = n1;
  25. i = j;
  26. }
  27. return n1;
  28. }
  29.  
  30. void my_join (int a, int b) {
  31. int n1 = my_find (a), n2 = my_find (b);
  32. if (n1 != n2)
  33. pre [n1] = n2;
  34. }
  35.  
  36. int main () {
  37. int k = ;
  38. while (~scanf ("%d%d", &n, &m)) {
  39. init ();
  40. char c;
  41. int a, b, ans = , temp [] = {};
  42. for (int i = ; i < m; ++ i) {
  43. getchar ();
  44. scanf ("%c", &c);
  45. if (c == 'U') {
  46. scanf ("%d%d", &a, &b);
  47. my_join (a, b);
  48. }
  49. else {
  50. scanf ("%d", &a);
  51. pre [a] = pos ++;
  52. }
  53. }
  54.  
  55. for (int i = ; i < n; ++ i) { // 查找有多少个区域
  56. if (!temp [my_find (i)]) { // 在一个区域的有共同的根节点
  57. temp [my_find (i)] = ;
  58. ++ ans;
  59. }
  60. }
  61. printf ("Case #%d: %d\n", k ++, ans);
  62. }
  63. }

nyoj 1022 合纵连横 (并查集<节点删除>)的更多相关文章

  1. nyoj 1022 合纵连横 经典并查集

    思路:关键在于并查集的删点操作. 给每个诸侯国一个另外的编号,比如box[i]表示诸侯国i现在处于第box[i]个联盟,可以随时改变它的联盟编号,并且让box[i] = k, 实现删除操作.以前联盟中 ...

  2. NYOJ 1022 合纵连横 (并查集)

    题目链接 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大.而实力弱的诸侯王为了不让自己的领 ...

  3. Nyoj 布线问题(并查集&&图论)

    描述南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有的楼都供上电.2.所用电线花费最少   输入 第一行是一个整数n表示有n组测试数据.(n ...

  4. nyoj 711 枚举+并查集

     #include<stdio.h>//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断 #include<stdlib.h>//枚举最大的一条边肯定 ...

  5. nyoj 1022 合纵连横【并查集节点的删除】

    合纵连横 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法 ...

  6. nyoj 1022:合纵连横(并查集删点)

    题目链接 参考链接 只附代码好了 #include<bits/stdc++.h> using namespace std; ; int a[N],b[N],vis[N]; int n,m, ...

  7. nyoj 38 简单并查集的应用&最小生成树

    #include<stdio.h> #include<stdlib.h> #define inf 0x3fffffff #define N 600 struct node { ...

  8. NYOJ 208 Supermarket (模拟+并查集)

    题目链接 描述 A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Pr ...

  9. NYOJ 129 树的判定 (并查集)

    题目链接 描述 A tree is a well-known data structure that is either empty (null, void, nothing) or is a set ...

随机推荐

  1. gedit 外部工具——快捷运行

    可快捷编译运行一些代码,适合新手使用. 配置如下. 快捷键:F5 保存:当前文档 输入:无 输出:无 使用范围:所有文档,所有语言 脚本如下. #!/bin/sh #author: srczhang# ...

  2. RIDE的External Resources

    External Resources(外部资源):主要指不在project管辖范围内的资源文件. 通俗来说,如果是目录的project,只要不在自己目录范围内的资源文件都算外部资源:如果是文件的pro ...

  3. Netty源码分析之ChannelPipeline(一)—ChannelPipeline的构造与初始化

    Netty中ChannelPipeline实际上类似与一条数据管道,负责传递Channel中读取的消息,它本质上是基于责任链模式的设计与实现,无论是IO事件的拦截器,还是用户自定义的ChannelHa ...

  4. 小白学 Python(7):基础流程控制(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  5. PHP使用RabbitMQ消息队列

    1.安装amqp拓展 安装流程 2.下载工具包 php-amqplib  composer require php-amqplib/php-amqplib   3.代码操作如下 [消费消息] < ...

  6. 微服务架构 ------ Day01 微服务架构优缺点

    1. 微服务架构的优点 庞大的单体程序 -> 一套微型程序. 每一个服务有明确的边界(服务之间的消息通讯机制) ,每一个服务都能单独的开发和维护,并且更好理解 每一个服务都能由一个团队来开发,当 ...

  7. OptimalSolution(4)--字符串问题(2)进阶

    一.将整数字符串转成整数值 二.判断字符数组中是否所有的字符都只出现过一次 三.在有序但含有空的数组中查找字符串 四.数组中两个字符串的最小距离 五.添加最少字符使字符串整体都是回文字符串 六.括号字 ...

  8. MySQL开发篇(4)表类型(存储引擎)的选择

    一.查看支持的存储引擎以及设置修改存储引擎 1.查看默认存储引擎:show variables like '%storage_engine%'; 2.查看当前数据库支持的存储引擎:show ENGIN ...

  9. jquery复习

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. R语言之脸谱图

    脸谱图和星图类似,但它却比星图可以表示更多的数据维度.用脸谱来分析多维度数据,即将P个维度的数据用人脸部位的形状或大小来表征.脸谱图在平面上能够形象的表示多维度数据并给人以直观的印象,可帮助使用者形象 ...