标签:style blog http color io os ar for sp
题目链接:http://poj.org/problem?id=1988
思路:并查集的扩展~, 感觉并查集里面很多都有用到当前点到祖先的距离。。 。。 这个题目要这么做,记录每个集合的元素个数,然后记录当前元素是第几个被插入到集合中的,其中涉及到了路径压缩。。最后的结果就是总的个数减去第几个被插入到集合。
#include <iostream> #include <cstdio> using namespace std; int n; int f[30020]; int sum[30020]; int num[30020]; int getf(int a) { if(f[a] == a) { return a; } int t = f[a]; f[a] = getf(f[a]); num[a] += num[t]; return f[a]; } void merge(int a, int b) { int x = getf(a); int y = getf(b); if(x != y) { f[y] = x; num[y] += sum[x]; sum[x] += sum[y]; } } void init() { for(int i=1; i<=30010; i++) { f[i] = i; num[i] = 0; sum[i] = 1; } } int main() { char s[2]; int a,b; while(cin>>n) { init(); for(int i=1; i<=n; i++) { scanf("%s",s); if(s[0] == ‘M‘) { scanf("%d %d",&a, &b); merge(a,b); } else if(s[0] == ‘C‘) { scanf("%d",&a); printf("%d\n", sum[getf(a)]-num[a]-1); } } } return 0; }
标签:style blog http color io os ar for sp
原文地址:http://www.cnblogs.com/ltwy/p/4013082.html