码迷,mamicode.com
首页 > 数据库 > 详细

Codeforces 755C:PolandBall and Forest(并查集)

时间:2017-01-17 07:40:03      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:problems   scanf   tar   思路   inf   merge   color   define   几分钟   

http://codeforces.com/problemset/problem/755/C

题意:该图是类似于树,给出n个点,接下来p[i]表示在树上离 i 距离最远的 id 是p[i],如果距离相等则p[i]是 id 较小的点。

思路:一开始没什么想法,画几分钟图发现不到什么东西,后来想着 i 和 p[i] 有关系,那么就代表 i 和 p[i] 是属于同一棵树,那么不就是并查集了嘛。抱着试一试的心态搞了一下居然过了。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <string>
 7 #include <iostream>
 8 #include <stack>
 9 #include <map>
10 #include <queue>
11 #include <set>
12 using namespace std;
13 typedef long long LL;
14 #define N 100010
15 #define INF 0x3f3f3f3f
16 int fa[N], num[N];
17 
18 int Find(int x) {
19     if(x == fa[x]) return x;
20     return fa[x] = Find(fa[x]);
21 }
22 
23 void Merge(int x, int y) {
24     x = Find(x), y = Find(y);
25     if(x == y) return ;
26     fa[x] = y;
27 }
28 
29 int main()
30 {
31     int n;
32     scanf("%d", &n);
33     for(int i = 1; i <= n; i++) fa[i] = i;
34     for(int i = 1; i <= n; i++) scanf("%d", &num[i]);
35     for(int i = 1; i <= n; i++) {
36         Merge(i, num[i]);
37     }
38     int ans = 0;
39     for(int i = 1; i <= n; i++) if(fa[i] == i) ans++;
40     printf("%d\n", ans);
41     return 0;
42 }

 

Codeforces 755C:PolandBall and Forest(并查集)

标签:problems   scanf   tar   思路   inf   merge   color   define   几分钟   

原文地址:http://www.cnblogs.com/fightfordream/p/6291508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!