[Acwing] 1144. 连接格点 Kruskal

前言

和上一题差不多,都是需要先加入边
传送门 :

思路

因为是二维所以我们需要将他转换成一维 i ∗ j + k i*j+k ij+k

排序操作可以避免了,因为值就1和2 所以我们可以先计算1的值,之后计算2的值

最后计算出答案即可

CODE

int find(int x)
{
	if(p[x]!=x)return p[x] = find(p[x]);
	return p[x];
	
}

inline int merge(int a,int b)
{
	int fa = find(a);
	int fb = find(b);
	if(fa!=fb)
	{
		p[fa] =fb;
		return 1;
	}
	return 0;
}
void cal()
{

}

void solve()
{
	cin>>n>>m;
	for(int i=1;i<=n*m;i++)
	{
		p[i] = i ;
	}
	
	int x1,x2,y1,y2;
	while(cin>>x1>>y1>>x2>>y2)
	{
		int a = (x1-1)*m +y1;
		int b = (x2-1)*m +y2;
		merge(a,b);
	}
	
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++){
			int  a = (j-1)*m + i;
			int  b = j*m+i;
			if(merge(a,b))
			ans++;
		}
	}
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<m;j++)
		{
			int a = (i-1)*m+j;
			int b =(i-1)*m+j+1;
			
			if(merge(a,b))
			ans+=2;

		}
		
	cout<<ans<<endl;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值