[HDU 5923]Prediction:并查集

HDU - 5923 Prediction(2016CCPC东北地区大学生程序设计竞赛) HDU - 5923 Prediction(2016CCPC东北地区大学生程序设计竞赛) 传送门HDU - 5923 题意 一开始先给你n,mn,mn,m,代表一个图的点数和magic树的点数。 然后再给你一棵magic树,这个树每个节点存的是图中的一条边,所有节点存的边的连接的点数最大不超过500。 每次询问会给你几个在magic树上的点,问你把这些点及其他们所有的祖先点所代表的边连上... 阅读详情

点击这里查看原题

考虑到n很小,对于树上每个点,选择它便会同时选择它的所有祖先,因此可以对每个点维护一个并查集,询问时做并查集合并即可。
复杂度O(nm+nk)。
不知道为何,我的get函数不加inline就会TLE,加上立马就过了,因为这个问题调了好几个小时。

/*
User:Small
Language:C++
Problem No.:5923
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=1e4+5;
int f[M][505],d[505],n,m,q;
vector<int> g[M];
struct no{
    int u,v;
}p[M];
inline int get(int *f,int x){
    return x==f[x]?x:f[x]=get(f,f[x]);
}
inline void join(int *f,int x,int y){
    x=get(f,x),y=get(f,y);
    f[y]=x;
}
void dfs(int u,int fa){
    for(int i=1;i<=n;i++) f[u][i]=f[fa][i];
    join(f[u],p[u].u,p[u].v);
    vector<int>::iterator it;
    for(it=g[u].begin();it!=g[u].end();it++)
        dfs(*it,u);
}
inline void solve(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) g[i].clear();
    for(int i=2;i<=m;i++){
        int x;
        scanf("%d",&x);
        g[x].push_back(i);
    }
    for(int i=1;i<=m;i++)
        scanf("%d%d",&p[i].u,&p[i].v);
    for(int i=1;i<=n;i++) f[0][i]=i;
    dfs(1,0);
    scanf("%d",&q);
    while(q--){
        int k,x,res=0;
        scanf("%d",&k);
        for(int i=1;i<=n;i++) d[i]=f[0][i];
        while(k--){
            scanf("%d",&x);
            for(int i=1;i<=n;i++)
                join(d,i,get(f[x],i));
        }
        for(int i=1;i<=n;i++) if(d[i]==i) res++;
        printf("%d\n",res);
    }
}   
int main(){
    freopen("data.in","r",stdin);//
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
        printf("Case #%d:\n",i);
        solve();
    }
    return 0;
}
HDU5923——Prediction(数据结构,并查集 Prediction Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 476    Accepted Submission(s): 109 Problem Description There is a graph  阅读详情

相关推荐

HDU 5923 Prediction

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

Occult 452

hdu5923 Prediction

jxt的思路 先膜一发 先处理 T这棵树上每个点到祖先这条链的点所生成的并查集 每个点的并查集都得分开来存 这个dfs做就好了 最后询问的时候 将k 个点的并查集合并就是这个询问的连通图 易得答案 #include<bits/stdc++.h> using namespace std; #define sz(X) ((int)X.size())...

diankeng5481的博客 149

HDU-5923 Prediction并查集/暴力)

传送门:HDU-5923 题意:给你一个图G(V,E),n个点m条边。然后有一棵点数为m的树T,根为1, 树中每个点对应为图G的每条边  接下来有q次查询,每次查询有一个点数为k的集合S, 如果一个树中一个点在集合S中,那么它的祖先也都要加入集合S,问由集合S组成的图G‘有多少个连通块 吐槽:表示从来没用过如此暴力的并查集,30w*500的复杂度竟然可以随便过(还有T组数据。。。 题解:并

十分残念的博客 810

HDU - 5923 Prediction 多个并查集

题目链接:https://vjudge.net/problem/HDU-5923 题解:因为n只有500个,所以我们可以每个点维护一个并查集,所以判断某些点的时候,这些并查集在合起来即可 #include <bits/stdc++.h> using namespace std; const int N = 510; struct edge { int x, y; }e[1001...

还我笑颜 194

HDU 5923 Prediction 并查集 合并

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5923代码#include <bits/stdc++.h> #define sf scanf #define pf printf using namespace std; const int maxn = 500 + 5,maxm = 10000 + 50; int Fa[maxm][maxn],n,m

SolarDomo的博客 489

Prediction 并查集 hdu-5923

题目链接:Problem - 5923 题面: 题意: 题意挺难理解的,有一张有n个点m条边的图,给定每个边的节点的父亲节点,现在这m条边组成了一棵根节点为1的魔术树(树的结点为边的id),然后给定这些边的节点,后面q次查询,查询这棵树的节点和所有父亲节点对应的边连接起来,一共有几个组件数量 思路:因为最后查询的集合内的内一个节点和所有父亲节点的联通图的组件数量,但是查询数量很大,我们不能反向查询父亲节点的方法去合并,但是我们可以通过预处理的方法,让儿子节点的并查集继承父亲节点, 然..

m0_55682843的博客 269

HDU5923-Prediction-有继承味道的并查集

目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门  原题目描述在最下面。  有一个n个节点m条边的无向图和一个m个节点的有根树(根为1)。树上每个节点和图中的某些边一一对应。  每次询问给一个树的点的集合S,真实完整的点集合不仅包含集...

ako2654的博客 160

持续化并查集HDU 5923 B - Prediction

Describe 输入n,m,给你一个树有n个节点m-1条边,输入m-1个整数,第i个整数为节点i+1的父节点;然后输入m条边,表示一个图,输入q表示有q次询问:每次询问输入k和k个整数,k个整数表示树上节点编号,树上节点编号对应图中边节点编号,集合S由输入的树上节点编号以及所有祖先节点构成,对于每一个询问,输出由集合S引入边集合后,途中有几个联通块 https://blog.csdn.net...

Df_cjc的博客 302

HDU 5923 Prediction [可持久化并查集]【数据结构】

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5923 ——————————————————————————-. PredictionTime Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 69

Tabris的博客 1239

HDU 5923 Prediction (并查集)

题意: 给定一个图G={V_G,E_G} G=\text{{V_G,E_G}} ,同时给定一个树T={VT∈EG,ET}T=\{V_T\in E_G,E_T\},给定qq组树上的点集合ViV_i,问由ViV_i以及ViV_i所有节点的父节点节点说构成的子图G′={VG,EG′∈Vi or EG′ is ancent of Vi}G'=\{ V_G,E_{G'}\in V_i \text{ or }

宝树啊宝树 648

hdu5923 Prediction(并查集/可继承的并查集+并查集合并)

题目 n(n<=500)个点,m(m<=1e4)条边,代表一个图G 以下m-1条边,生成一棵m个节点的魔法树 以下m条边,第i条边为树上的第i个节点所保存, q(q<=5e4)个询问, 每次给出k个节点,释放这些节点本身保存的边, 也释放这些节点在魔法树上的祖先节点保存的边, 这些边和原图G的所有节点构成一个新图G’ 对于每个询问,求G’的联通块的个数 数据保证...

小衣同学的博客 286

HDU 5923 Prediction (可持久化并查集带注释) ------待补

原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5923 题意:给你一个图G(V,E),n个点m条边。然后有一棵点数为m的树T,根为1, 树中每个点对应为图G的每条边 接下来有q次查询,每次查询有一个点数为k的集合S, 如果一个树中一个点在集合S中,那么它的祖先也都要加入集合S,问由集合S组成的图G‘有多少个连通块 思路:可持久化并查集的应用,...

yiqzq的博客 457

HDU5923 2016CCPC东北地区大学生程序设计竞赛 - 重现赛 B】【并查集 暴力 复杂度计算】Prediction 生效若干条链上的所有边条件下的联通块情况

Prediction Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 356    Accepted Submission(s): 63 Problem Description There is a graph G =\l

snowy_smile的博客 1571

HDU-5923 Prediction

There is a graph G=VG,EGwith |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 ...

Pei_1997的博客 362

HDU5923-Prediction

Prediction                                                                        Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)                              

wang_128的博客 420
上一篇: [HDU 5710]Digit-Sum:其他
下一篇: [HDU 4864]Task:贪心
BrooksBUAA
博客等级 码龄10年 11粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值