王道考研 ++++ 并查集(C语言 对应题目--冗余关系)

#include <stdio.h>

#define Max 1001

int Father[Max];//记录某点的 父节点
int Ranki[Max];//秩 记录总共有多少个节点

//查找父节点
int FindFather(int Child)
{
  if(Father[Child] == Child)return Child;//返回最高父节点
  else return FindFather(Father[Child]);//一直找 父亲的父亲
}
//获取冗余个数
int GetAnswer(int m,int n)
{
  int A[n],B[n];//A[i] - B[i] 记录一组关系
  int i,sum = 0;

  for(i = 0;i < n;i++)
      scanf("%d%d",&A[i],&B[i]);

  //开始将 所有父节点都置为自己 秩都为1
  for(i = 0;i < m;i++)
  {
    Father[i] = i;
    Ranki[i] = 1;
  }

  for(i = 0;i < n;i++)
  {
      //获取 A[i] 与 B[i] 的最高父节点
      int SetA = FindFather(A[i]);
      int SetB = FindFather(B[i]);

      //如果他俩的父节点 相等
      if(SetA == SetB)sum++;
      else
      {   //谁的权大 认谁做父亲
          //当权相等的时候 默认A的父亲是B的父亲
          if(Ranki[SetA] >= Ranki[SetB])
          {
              Father[SetB] = SetA;
              Ranki[SetA] += Ranki[SetB];
          }
          else
          {
              Father[SetA] = SetB;
              Ranki[SetB] += Ranki[SetA];
          }
      }
  }
  return sum;
}
int main(int argc, char const *argv[])
{
  int m,n;//人的个数 关系数量
  scanf("%d%d",&m,&n);

  int Answer = GetAnswer(m,n);
  printf("%d\n",Answer);
  return 0;
}
/*
6 7
1 2
3 4
4 6
5 3
2 5
1 6
2 4
*/

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值