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 }