(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

目录

题意:传送门

 原题目描述在最下面。

 有一个n个节点m条边的无向图和一个m个节点的有根树(根为1)。树上每个节点和图中的某些边一一对应。

 每次询问给一个树的点的集合S,真实完整的点集合不仅包含集合里面的点,还包含这些点在树上的祖先。这个完整的点集合对应了图中一些边集合。输出这个图的边集合的联通块的个数。

思路:

  • 判断联通用并查集很方便咯。

  • 因为询问带有一点继承的味道。因为每个点的父节点也算在其中了。

  • 所以针对此题要用一个可继承的并查集:对树上每个节点维护一个图连通性的并查集。然后每个子节点\(v\)继承其父节点\(u\)的并查集,并在此基础上将新的一条边\(u->v\)添加进\(v\)节点的并查集。加边就是并查集的合并操作。

  • 对于每个询问,就把点集中每个点的并查集合并。意思就是把每个点的联通块合并在一起。最后数联通块的个数。

  • 代码中还有一点注释。

AC代码:

#include <bits/stdc++.h>
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
int n, m, q;
vector<int> son[10005];
int mp[10005][2], fa[10005][505], vis[505];
int Fi(int id,int x){
return fa[id][x]==x?x:fa[id][x]=Fi(id,fa[id][x]);
}
void un(int id,int a,int b){
int pa=Fi(id,a),pb=Fi(id,b);
if(pa==pb)return;
fa[id][pb]=pa;
}
void dfs(int u,int Fa){//每个节点继承其父节点的并查集
for(int i=1;i<=n;++i)fa[u][i]=fa[Fa][i];
un(u,mp[u][0],mp[u][1]);
int len=son[u].size();
for(int i=0;i<len;++i){
dfs(son[u][i],u);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("E://ADpan//in.in", "r", stdin);
//freopen("E://ADpan//out.out", "w", stdout);
#endif
int tim,tc = 0;
scanf("%d", &tim);
while(tim--){
scanf("%d%d",&n,&m);
for(int i=0;i<=m;++i)son[i].clear();
for(int i=2,x;i<=m;++i){
scanf("%d",&x);
son[x].push_back(i);
}
for(int i=1,u,v;i<=m;++i){
scanf("%d%d",&u,&v);
mp[i][0]=u;mp[i][1]=v;
}
for(int i=0;i<=n;++i)fa[0][i]=i;
dfs(1,0);
printf("Case #%d:\n", ++tc);
scanf("%d",&q);
while(q--){
int cnt;scanf("%d",&cnt);
for(int i=1;i<=n;++i)fa[0][i]=i,vis[i]=0;
//将cnt个节点及其父节点的并查集合并
for(int i=0,x;i<cnt;++i){
scanf("%d",&x);
for(int j=1;j<=n;++j){
int tfa = Fi(x,j);
//这个处理是精髓
if(tfa!=j){//表示在此子图中这两个点联通,故合并
un(0,tfa,j);
}
}
}
int ans=0;
for(int i=1;i<=n;++i){
int tmp = Fi(0,i);
if(vis[tmp]==0){
vis[tmp]=1;
ans++;
}
}
printf("%d\n", ans);
}
}
return 0;
}

原题目描述:

Problem Description

There is a graph G=⟨VG,EG⟩ with |VG|=n and |EG|=m, and a magic tree T=⟨VT,ET⟩) rooted at 1, which contains m vertices.

Each vertex of the magic tree corresponds to an edge in the original graph G and each edge occurs in the magic tree exactly once.

Each query includes a set S(S⊆VT), and you should tell Mr. Frog the number of components in the modified graph G‘=(VG,E‘G), where E‘G is a set of edges in which every edge corresponds to a vertex v in magic tree T satisfying at least one of the following two conditions:

∙v∈S.

∙v is an ancestor of some vertices in S.

Note that the queries are independent, and namely one query will not influence another.

Input

The input contains several test cases and the first line of the input data is an integer T, denoting the number of test cases.

For each test case, the first line contains two integers n and m(1≤n≤500,1≤m≤10000), where n is the number of vertices and m is the number of edges.

The second line contains m - 1 integers describing the magic tree, i-th integer represents the parent of the (i + 1)-th vertex.

Then the following m lines describe the edges of the graph G. Each line contains two integers u and v indicating the two ends of the edge.

The next line contains only one integer q(1≤q≤50000), indicating the number of queries.

Then the following q lines represent queries, i-th line represents the i-th query, which contains an integer ki followed by ki integers representing the set Si.

It is guarenteed that ∑qi=1ki≤300000.

Output

For each case, print a line "Case #x:", where x is the case number (starting from 1).

For each query, output a single line containing only one integer representing the answer, namely the number of components.

Sample Input

1

5 4

1 1 3

1 2

2 3

3 4

4 5

3

1 2

2 2 3

2 2 4

Sample Output

Case #1:

3

2

1

Hint

magic tree and the original graph in the sample are:

In the first query, S = {2} and the modified graph G' = {{1, 2, 3, 4}, {(1, 2), (2, 3)}}, thus the number of the components in the modified graph is 3.

In the second query, S = {1, 2, 3}, where 1 is the ancestor of 2 (and 3) in the magic tree, and the modified graph G'' = {{1, 2, 3,4}, {(1, 2), (2, 3), (3, 4)}},

therefore the number of the components in the modified graph is 2.

In the third query, S = {1, 2, 3, 4}, where 1 is the ancestor of 2 (and 4), 3 is the ancestor of 4, and the modified graph G' = {{1, 2, 3,4}, {(1, 2), (2, 3), (3,4), (4, 5)}},

therefore the answer equals to 1.

Source

2016CCPC东北地区大学生程序设计竞赛 - 重现赛

HDU5923-Prediction-有继承味道的并查集的更多相关文章

  1. hdu5923 Prediction

    jxt的思路 先膜一发 先处理 T这棵树上每个点到祖先这条链的点所生成的并查集 每个点的并查集都得分开来存 这个dfs做就好了 最后询问的时候 将k 个点的并查集合并就是这个询问的连通图 易得答案 # ...

  2. HDU 5923 Prediction(2016 CCPC东北地区大学生程序设计竞赛 Problem B,并查集)

    题目链接  2016 CCPC东北地区大学生程序设计竞赛 B题 题意  给定一个无向图和一棵树,树上的每个结点对应无向图中的一条边,现在给出$q$个询问, 每次选定树中的一个点集,然后真正被选上的是这 ...

  3. HDU 2860 并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=2860 n个旅,k个兵,m条指令 AP 让战斗力为x的加入y旅 MG x旅y旅合并为x旅 GT 报告x旅的战斗力 ...

  4. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  5. 关押罪犯 and 食物链(并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  6. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  7. bzoj1854--并查集

    这题有一种神奇的并查集做法. 将每种属性作为一个点,每种装备作为一条边,则可以得到如下结论: 1.如果一个有n个点的连通块有n-1条边,则我们可以满足这个连通块的n-1个点. 2.如果一个有n个点的连 ...

  8. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  9. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

随机推荐

  1. leetcode-164周赛-1268-搜索推荐系统

    题目描述: 自己的提交: class Solution: def suggestedProducts(self, products: List[str], searchWord: str) -> ...

  2. 用php 生成 excel 表格

    //引用新建对象require "../phpexcel/Classes/PHPExcel.php"; $excel = new PHPExcel(); 建表格 //Excel表格 ...

  3. CF1016F 【Road Projects】

    思路 可以考虑另一种想法:因为我们发现,答案是肯定不会大于在原来的树上的最短路径的.所以原来的最短路是(有可能的)最大值! 我们把树变成这样,提取出1~n的路径,方便观看撕烤: (它有个我起的名字,叫 ...

  4. jmeter测试之-脚本制作

    一.脚本录制  1.遇见的问题,回放的时候总是登录失败 解决方式:设置HTTP请求为—跟随重定向 2.新增一个用户的时候,脚本参数里面输入汉字,在浏览器查看的时候显示问号 解决方式:脚本编码方式增加u ...

  5. centos 下安装 shpinx2.1.7 记录

    安装sphinx yum install -y mysql mysql-devel yum install automake autoconf cd /usr/local/src/ wget http ...

  6. mysql笔试题大餐---1、组合查询方式及having

    mysql笔试题大餐---1.组合查询方式及having 一.总结 一句话总结: 实践:我之前的mysql真的学的太浅了,这种情况下,依据实践(做题)才是唯一能把它学好的方式 学的暂时够了,以实践而学 ...

  7. HTML-参考手册: HTTP 状态消息

    ylbtech-HTML-参考手册: HTTP 状态消息 1.返回顶部 1. HTTP 状态消息 当浏览器从 web 服务器请求服务时,可能会发生错误. 以下列举了有可能会返回的一系列 HTTP 状态 ...

  8. Linux两台机器简历信任

    cd ~/.ssh ssh-keygen  -t  rsa scp ./id_rsa.pub root@192.168.1.1:/root/.ssh/authorized_keys

  9. python 实现异常退出

    https://blog.csdn.net/u013385362/article/details/81206822 有时当一个条件成立的情况下,需要终止程序,可以使用sys.exit()退出程序.sy ...

  10. Spring Boot Restful WebAPI集成 OAuth2

    系统采用前后端分离的架构,采用OAuth2协议是很自然的事情. 下面开始实战,主要依赖以下两个组件: <dependency> <groupId>org.springframe ...