C: City

时间限制: 1 s      内存限制: 128 MB     

题目描述

如果城市A和城市B互通,城市B和城市C互通,那么城市A和城市C也互通,A、B、C三个城市算一个聚集点。先已知有n个城市和m条道路,想求的是有几个聚集点?但小S觉得太简单了,由于战争原因,某些城市会被导弹销毁掉,与之相应的道路也变得不可用。之前已经被销毁的不会被复原。现给定每次销毁的城市顺序,求每次销毁后聚集点有多少个。

输入

第一行输入n

和m,表示城市数量和道路数量(1≤n≤104,1≤m≤2n)

接下来m

行,每行输入两个数ai和bi (1≤ai,bi≤n)

。表示ai和bi直接有道路

第m+2

行输入q,表示有q个城市会被销毁 (1≤q≤n)

接下来输入q

个数,每行输入一个不重复的数,表示被销毁的城市

输出

输出一行q个数,每i个数表示第i个城市销毁后聚集点的数量

样例输入

8 9
1 2
1 3
1 6
2 4
3 6
4 5
4 7
5 7
5 8
4
3 2 5 4

样例输出

1 2 3 3
 
#include<iostream>
#include<string.h>
#include<math.h>
#define ll long long
using namespace std;
int a[100005], b[100005], c[100005], p[100005], ans[100005], vis[100005], r[100005];
int n, m, t = 0, cnt;
void init()//初始化集合,每个元素的根节点都是自己
{for (int i = 1; i <= n; i++){p[i] = i;}
}int find(int x)//查找元素x的根节点是谁
{if (x == p[x])return x;elsereturn p[x] = find(p[x]);
}void join(int x, int y)//合并两个集合
{int xRoot = find(x);int yRoot = find(y);if (xRoot == yRoot) //根节点相同,不合并return;if (r[xRoot] < r[yRoot]) //r[i]是元素i所在树的高度,矮树的根节点认高树的根节点做根节点p[xRoot] = yRoot;else if (r[xRoot] > r[yRoot])p[yRoot] = xRoot;else{p[yRoot] = xRoot;//树高相同,做根节点的树高度要加一r[xRoot]++;}
}
void num()//求不同子集个数
{for (int i = 1; i <= n; i++)//有多少个p[i]==i,就有多少个子集
    {if (p[i] == i && vis[i] == 0)t++;}
}
bool sameRoot(int x, int y)//查询两个元素的老板是否相同
{return find(x) == find(y);
}
int main()
{scanf("%d%d", &n, &m);init();cnt = n;//当元素各不相连的时候,有n个集合for (int i = 1; i <= m; i++){scanf("%d%d", &a[i], &b[i]);}int k;scanf("%d", &k);for (int i = 1; i <= k; i++){scanf("%d", &c[i]);vis[c[i]] = 1;}for (int i = 1; i <= m; i++){if (vis[a[i]] == 0 && vis[b[i]] == 0)join(a[i], b[i]);}num();int base = t;//销毁所有c[i]元素之后可以构成几个子集cnt = base;ans[k + 1] = base;for (int i = k; i >= 1; i--){vis[c[i]] = 0;cnt = cnt + 1;ans[i] = cnt;for (int j = 1; j <= m; j++){if (a[j] == c[i] && vis[b[j]] == 0){if (sameRoot(a[j], b[j]))ans[i] = cnt;else{join(a[j], b[j]);{cnt = cnt - 1;ans[i] = cnt;}}}if (b[j] == c[i] && vis[a[j]] == 0){if (sameRoot(a[j], b[j]))ans[i] = cnt;else{join(a[j], b[j]);{cnt = cnt - 1;ans[i] = cnt;}}}}}for (int i = 2; i <= k + 1; i++){printf("%d", ans[i]);if (i != k + 1)printf(" ");}printf("\n");//system("pause");return 0;
}

相似题目:https://www.cnblogs.com/-citywall123/p/10719924.html

转载于:https://www.cnblogs.com/-citywall123/p/10729243.html

C: City----逆向并查集相关推荐

  1. [逆向并查集+STLmap存图奇法] Connections in Galaxy War ZOJ - 3261

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 这题 感谢bo同学大力帮助...告诉我 奇技淫巧 虽然思路蛮顺的 题 ...

  2. hdu 4496 并查集 逆向 并查集删边

    貌似某大犇说过 正难则反,,, 题目说要对这张图进行删边,然后判断联通块的个数,那么就可以先把所有边都删掉,之后从后往前加边,若加的边两端点不在同一个联通块中, 那么此时联通快个数少一,否则不变 1 ...

  3. 【转】并查集MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 ...

  4. ZOJ3261并查集逆向处理

    题意:       给你一些点,还有一些边,每个点上都有一个权值,然后有一些询问,分为两种, query a 询问与a直接或者间接想连的点中最大权值的是那个点,输出那个点,如果那个点的权值小于等于a的 ...

  5. UVA1455 - Kingdom(并查集 + 线段树)

    UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...

  6. Valentine's Day Round hdu 5176 The Experience of Love [好题 带权并查集 unsigned long long]

    传送门 The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  7. POJ1703 Find them, Catch them 并查集

    点击打开链接 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50757   Ac ...

  8. Codeforces Round #260 (Div. 1) C. Civilization(dfs+并查集)

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. Find them, Catch them POJ - 1703(种类并查集)

    题意: 在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 1.输入D x y代表x于y不在一个团伙里 2.输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙 ...

  10. 2017西安交大ACM小学期 毁灭序列[倒跑并查集]

    毁灭序列 发布时间: 2017年7月4日 20:58   最后更新: 2017年7月6日 22:23   时间限制: 1000ms   内存限制: 512M 描述 给出一个n(1≤n≤2×105)个非 ...

最新文章

  1. Vlan间路由实验(单臂路由实现法)
  2. 普通人学python有用吗 知乎-哪些人更有必要学习python?老男孩教育python
  3. MySQL-MHA集群部署(binlog复制)
  4. Centos7下安装Docker(详细安装教程、傻瓜式安装)
  5. 面试智力题:天平称球
  6. POJ3006-Dirichlet's Theorem on Arithmetic Progressions
  7. 别等了,全面「远程办公」凉了
  8. 从零实现一个3D目标检测算法(3):PointPillars主干网实现(持续更新中)
  9. PLSQL 安装+配置( Oracle数据库连接工具 )
  10. 2022-03-13 转载 Dockerfile 高阶使用指南及镜像优化
  11. java paint清空_调用paint方法时Java清除屏幕 – 如何避免?
  12. CSDN超实用的浏览器插件—去自家网站搜索广告、超快捷万能搜索、各种实用小功能等诸多功能等你探索
  13. Day 11 - 视频转换成图片
  14. 聚合数据API接口调用方法
  15. 无线传输时间同步 (基于NRF52设备)
  16. K8S学习笔记之将Google的gcr.io、k8s.gcr.io 换为国内镜像
  17. 【《视觉SLAM十四讲》前ch2-ch6实践全过程和遇到的问题及解决办法】
  18. OpenCV图像处理---模糊原理
  19. 什么是前端开发?什么是后端开发?
  20. 【Oracle】高级查询练习题详解

热门文章

  1. ASP.NET Core MVC 之依赖注入 View
  2. Codeforces 666E. Forensic Examination
  3. [luoguP1849] [USACO12MAR]拖拉机Tractor(spfa)
  4. codeblock不能调试
  5. UVa 208 Firetruck【回溯】
  6. 实时监听输入框值变化的完美方案:oninput onpropertychange
  7. sunos 查cpu主频指令prtdiag
  8. Struts2显示double价格格式0.00
  9. 别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集
  10. ubuntu 编译 /usr/bin/ld: cannot find 问题解决