AOJ 2170 Marked Ancestor (基础并查集)

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45522

给定一棵树的n个节点,每个节点标号在1到n之间,1是树的根节点,有如下两种操作:

M v :把编号为v的节点标记。

Q v :查询与v节点距离最近的被标记的点的编号。最初只有根节点被标记。

输入n-1个数表示,每一个数是当前第i个数的父节点,输出对于每个查询得到标号的总和。

并查集与树的结合,在输入的时候就可以根据父节点的关系建立并查集,1的父亲是1.

还有把编号为v的节点标记的意思是等同于把这颗子树从并查集里面分出来。因为只要这个节点被标记,那么他的字节点一定是到这个节点的距离最小。

理解清楚这题就很简单,只涉及到查找这个操作。注意sum可能溢出。

 1 #include<cstdio>
 2 int par[100010];
 3 int find(int x)
 4 {
 5     if(x==par[x]) return x;
 6     return find(par[x]);
 7 }
 8 int main()
 9 {
10     int n,q,a,b;
11     while(~scanf("%d%d",&n,&q))
12     {
13         if(n==0&&q==0) break;
14         for(int i=2;i<=n;i++)
15         {
16             scanf("%d",&par[i]);
17         }
18         par[1]=1;
19         long long sum=0;
20         char s[5];
21         while(q--)
22         {
23             scanf("%s%d",s,&b);
24             if(s[0]==‘Q‘) sum+=find(b);
25             else if(s[0]==‘M‘) par[b]=b;  //分离 b节点
26         }
27         printf("%lld\n",sum);
28     }
29     return 0;
30 }
时间: 2024-10-13 20:54:20

AOJ 2170 Marked Ancestor (基础并查集)的相关文章

hdu 1829 A Bug&#39;s Life (基础并查集)

题目: 链接:点击打开链接 题意: 给定虫子的交配关系,确定实验是否支持教授的假设即没有同性恋或者不符合假设. 思路: 是一道基础的并查集题目.存在两个集合异性和同性,给出多组关系,看这两个集合有木有联系,即是否有同性恋. 定义一个数组sex[],sex[i]表示与编号i的性别相反的虫子编号.然后将和i虫子有联系的合并为同一个集合(认为是同性的).如果findset(u) == findset(v),出现了反常行为. 代码: #include <iostream> #include <c

【转】POJ 2492 A Bug&#39;s Life:基础并查集进阶

思路参考这里(较详细) 一开始总是WA调了一晚上原来···Init初始化写在scanf上面了···哎╮(╯▽╰)╭anyway!对并查集的理解更深了一步! #include<cstdio> #include<cstring> using namespace std; #define Size 2000 struct node { int Pre; int Relation;// 与父节点的关系 0同性 1异性 }Bug[Size+1]; int N, M; bool found;

HDU2120Ice_cream&#39;s world I(基础并查集)

Ice_cream's world I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 698    Accepted Submission(s): 398 Problem Description ice_cream's world is a rich country, it has many fertile lands. Today,

hdu 1829 基础并查集,查同性恋

A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13709    Accepted Submission(s): 4449 Problem Description Background Professor Hopper is researching the sexual behavior of a rare

HDU1325 &amp;&amp;poj1308 基础并查集

和上一道小希的迷宫差不多,但是在HDU上提交一直WA,POJ过了 HDU的数据太强了吧,强的我感觉数据有问题 题意:输入若干对点,判断是否是一颗树,转化过来也就是是否存在环 点数-边数=1,还要判断每个点的入度都<=1 POJ AC代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> const

HDU1272 小希的迷宫(基础并查集)

杭电的图论题目列表,共计500题,努力刷吧 AC 64ms #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> const int INF = 1e8; using namespace std; int father[100010]; bool vis[100010]; int findx(int r) {

HDU-1102 畅通工程(基础并查集)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 59364    Accepted Submission(s): 31759 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直

poj-2236 Wireless Network (基础并查集)

http://poj.org/problem?id=2236 由于发生了地震,有关组织组把一圈电脑一个无线网,但是由于余震的破坏,所有的电脑都被损坏,随着电脑一个个被修好,无线网也逐步恢复工作,但是由于硬件的限制,一台电脑和另一台电脑能够相连当他们之间的距离小于d,或者还有一台电脑当中介,分别与两台电脑相连. 在修复的过程中,工作者会有两种操作,修复电脑和询问电脑a和电脑b是否相连.当询问的时候输出答案. 因为输入数据很大,需要快速判断电脑a和电脑b相连,所以自然想到用并查集. 初始时候 全部电

poj2236 基础并查集

题目链接:http://poj.org/problem?id=2236 题目大意:城市网络由n台电脑组成,因地震全部瘫痪,现在进行修复,规定距离小于等于d的电脑修复之后是可以直接相连 进行若干操作,O a,修复编号为a的电脑,S a,b  询问a,b电脑能否联系 思路分析:并查集,只是和并条件变了,首先要已经被修复(vis数组)其次距离要小于d,并查集搞完之后 询问的时候只需要看他们是不是有着相同的根节点即可. 代码: #include <iostream> #include <cstd