2492解题报告

 这道题是我ac的比较难的一道了,其中不仅要记录自己的父节点,还要用一个数组来记录父节点对应的异性父节点(怎么就这么拗口呢...),在将父节点的异性进行与该节点的异性的父节点进行合并(更拗口...)

具体看代码~~

  1. #include <stdio.h>
  2. #include <memory.h>
  3. int parent[2001];
  4. int aparent[2001];
  5. int FindParent(int a) {
  6.     while( a != parent[a])
  7.         a = parent[a];
  8.     return a;
  9. }
  10. //同性间的集合合并
  11. int MergeSet(int a,int b)
  12. {
  13.     if( a > b) 
  14.         return(parent[b] = a);
  15.     else
  16.         return(parent[a] = b);
  17. }
  18. //将不同性别的集合进行分类合并
  19. //就是让x 和 y的异性 的集合进行合并
  20. int MergeOppisiteSet(int a,int b)
  21. {
  22.     bool flag = true;
  23.     int t1 = FindParent(a);
  24.     int t2 = FindParent(b);
  25.     //如果(a和b同性) 或 (a的异性 和 b的异性 同性)则出现悖论
  26.     if( t1 == t2 || (aparent[t1] && aparent[t2] && aparent[t1] == aparent[t2]))
  27.         return 0;
  28.     if( aparent[t1] != t2)
  29.         aparent[t1] = MergeSet(aparent[t1],t2);
  30.     if( aparent[t2] != t1)
  31.         aparent[t2] = MergeSet(aparent[t2],t1);
  32.     return 1;
  33. }
  34. int main()
  35. {
  36.     int time,n,d;
  37.     int x,y;
  38.     scanf("%d",&time);
  39.     forint i = 1; i <= time; i++) {
  40.         bool flag = true;
  41.         scanf("%d%d",&n,&d);
  42.         memset(aparent,0,(n + 1) * sizeofint ));
  43.         forint j = 1; j <= n; j++)
  44.             parent[j] =  j;
  45.         forint j = 0 ; j < d; j++) {
  46.             scanf("%d%d",&x,&y);
  47.             //对每一对异性进行 分类合并
  48.             if(!MergeOppisiteSet(x,y))
  49.                 flag = false;
  50.         }
  51.         if( flag )
  52.             printf("Scenario #%d:/nNo suspicious bugs found!/n/n",i);
  53.         else
  54.             printf("Scenario #%d:/nSuspicious bugs found!/n/n",i);
  55.     }
  56. }

这道题后我要把食物链给ac了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值