1988解题报告

AccecptTime:         2008-12-17 15:05:08
Language:                c++         
Memory:                556K
Time:                      219MS
Errors:                    8 TLE + 4 RE

Algorithm:             并查集

  1. #include <stdio.h>
  2. int parent[30001];
  3. // 用于储存节点下的元素个数
  4. int under[30001];
  5. // 用于储存节点到父节点的距离
  6. int height[30001];
  7. void MergeSet(int x,int y)
  8. {
  9.     height[y] += under[x] + 1;
  10.     under[x] += under[y] + 1;
  11.     parent[y] = x;
  12. }
  13. //在找父节点的同时将路径压缩,并更新节点与父节点的距离
  14. int FindParent(int x,int &hx)
  15. {
  16.     int xParent;
  17.     if(parent[x]) {
  18.         xParent = FindParent(parent[x],height[parent[x]]); 
  19.         hx += height[parent[x]];
  20.         return parent[x] = xParent;
  21.     }
  22.     return x;
  23. }
  24. int main()
  25. {
  26.     int n;
  27.     int x, y, t1, t2;
  28.     char s[20];
  29.     scanf("%d/n",&n);
  30.     forint i = 0; i < n; i++) {
  31.         gets(s);
  32.         if(s[0] == 'M') {
  33.             sscanf(s,"M %d%d",&x,&y);
  34.             t1 = FindParent(x,height[x]);
  35.             t2 = FindParent(y,height[y]);
  36.             MergeSet(t1,t2);
  37.         }
  38.         else {
  39.             sscanf(s,"C %d",&x);
  40.             // 找出父节点的同时更新节点到父节点的距离
  41.             t1 = FindParent(x,height[x]);
  42.             //节点下的节点个数为  父节点下节点个数 - 该节点到父节点的距离
  43.             printf("%d/n",under[t1] - height[x]);
  44.         }
  45.     }
  46. }

这道题考察的是并查集,另外需要外加两个辅助数组来储存状态。由于special judge,对路径的压缩是必须的,这也是我TLE8次的原因,另外的4个RE是由于审题不慎造成的。我得到了一个教训,当你毫无头绪的时候不要盲目尝试,当你的思路清晰了很快就可以过了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值