Ice_cream's world I

本文介绍了一个基于并查集算法的土地分配问题解决方案。在一个由观察塔和围墙构成的地图中,通过并查集确定可以分配给勤奋ACMer的最大土地数量。文章提供了完整的C语言实现代码,并解释了如何通过跟踪节点的根来确定独立区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

ice_cream's world is a rich country, it has many fertile lands. Today, the queen of ice_cream wants award land to diligent ACMers. So there are some watchtowers are set up, and wall between watchtowers be build, in order to partition the ice_cream’s world. But how many ACMers at most can be awarded by the queen is a big problem. One wall-surrounded land must be given to only one ACMer and no walls are crossed, if you can help the queen solve this problem, you will be get a land.

Input

In the case, first two integers N, M (N<=1000, M<=10000) is represent the number of watchtower and the number of wall. The watchtower numbered from 0 to N-1. Next following M lines, every line contain two integers A, B mean between A and B has a wall(A and B are distinct). Terminate by end of file.

Output

Output the maximum number of ACMers who will be awarded.
One answer one line.

Sample Input

8 10
0 1
1 2
1 3
2 4
3 4
0 5
5 6
6 7
3 6
4 7

Sample Output

3

Author

Wiskey

Source

本题考查并查集,主要该思考的点式要围成一块地方,那么这个集合是联通的所以有相同根的时候就是一个地方,每相等一次,就加一次,以下是我写的代码。

#include<stdio.h>
int a[1000],n,m,d,b;
void fu()//给数组初始化,令值等于本身的角标
{
int i;
for(i=0;i<=n-1;i++)
a[i]=i; 
}
int fine(int x)//寻找根节点的函数
{
 int r=x;
 while(r!=a[r])
 r=a[r];
 int i,j;
 i=x;
 while(i!=r)
 {
 j=a[i];
 a[i]=r;
 i=j;
 }
 return r;
}
void join(int x,int y)//并两个集合的函数
{int fx,fy;
fx=fine(x);
fy=fine(y);
if(fx!=fy)
a[fx]=fy; 
}
int main()
{
 while(scanf("%d%d",&n,&m)!=EOF)
 {
 int c=0;
  fu();
  while(m--)
  {
   scanf("%d%d",&d,&b);
   if(fine(d)==fine(b))//每两个元素的根节点相同,就加一个地方
   c++;
   else
   join(d,b);
   
  }
  printf("%d\n",c);
 }
 
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值