C: City----逆向并查集
C: City
题目描述
如果城市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----逆向并查集相关推荐
- [逆向并查集+STLmap存图奇法] Connections in Galaxy War ZOJ - 3261
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 这题 感谢bo同学大力帮助...告诉我 奇技淫巧 虽然思路蛮顺的 题 ...
- hdu 4496 并查集 逆向 并查集删边
貌似某大犇说过 正难则反,,, 题目说要对这张图进行删边,然后判断联通块的个数,那么就可以先把所有边都删掉,之后从后往前加边,若加的边两端点不在同一个联通块中, 那么此时联通快个数少一,否则不变 1 ...
- 【转】并查集MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 ...
- ZOJ3261并查集逆向处理
题意: 给你一些点,还有一些边,每个点上都有一个权值,然后有一些询问,分为两种, query a 询问与a直接或者间接想连的点中最大权值的是那个点,输出那个点,如果那个点的权值小于等于a的 ...
- UVA1455 - Kingdom(并查集 + 线段树)
UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...
- 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 ...
- POJ1703 Find them, Catch them 并查集
点击打开链接 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 50757 Ac ...
- Codeforces Round #260 (Div. 1) C. Civilization(dfs+并查集)
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Find them, Catch them POJ - 1703(种类并查集)
题意: 在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 1.输入D x y代表x于y不在一个团伙里 2.输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙 ...
- 2017西安交大ACM小学期 毁灭序列[倒跑并查集]
毁灭序列 发布时间: 2017年7月4日 20:58 最后更新: 2017年7月6日 22:23 时间限制: 1000ms 内存限制: 512M 描述 给出一个n(1≤n≤2×105)个非 ...
最新文章
- Vlan间路由实验(单臂路由实现法)
- 普通人学python有用吗 知乎-哪些人更有必要学习python?老男孩教育python
- MySQL-MHA集群部署(binlog复制)
- Centos7下安装Docker(详细安装教程、傻瓜式安装)
- 面试智力题:天平称球
- POJ3006-Dirichlet's Theorem on Arithmetic Progressions
- 别等了,全面「远程办公」凉了
- 从零实现一个3D目标检测算法(3):PointPillars主干网实现(持续更新中)
- PLSQL 安装+配置( Oracle数据库连接工具 )
- 2022-03-13 转载 Dockerfile 高阶使用指南及镜像优化
- java paint清空_调用paint方法时Java清除屏幕 – 如何避免?
- CSDN超实用的浏览器插件—去自家网站搜索广告、超快捷万能搜索、各种实用小功能等诸多功能等你探索
- Day 11 - 视频转换成图片
- 聚合数据API接口调用方法
- 无线传输时间同步 (基于NRF52设备)
- K8S学习笔记之将Google的gcr.io、k8s.gcr.io 换为国内镜像
- 【《视觉SLAM十四讲》前ch2-ch6实践全过程和遇到的问题及解决办法】
- OpenCV图像处理---模糊原理
- 什么是前端开发?什么是后端开发?
- 【Oracle】高级查询练习题详解
热门文章
- ASP.NET Core MVC 之依赖注入 View
- Codeforces 666E. Forensic Examination
- [luoguP1849] [USACO12MAR]拖拉机Tractor(spfa)
- codeblock不能调试
- UVa 208 Firetruck【回溯】
- 实时监听输入框值变化的完美方案:oninput onpropertychange
- sunos 查cpu主频指令prtdiag
- Struts2显示double价格格式0.00
- 别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集
- ubuntu 编译 /usr/bin/ld: cannot find 问题解决