1564: 数据结构基础65-连接格点[命题人 : admin]时间限制 : 1.000 sec 内存限制 : 128 MB题目描述有一个M行N列的点阵,相邻两点可以相连。一条纵向的连线花

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int m,n,tot=0,f[1000001];
void init();
int find(int);
void merge(int,int);
void work();
int main()
{
	init();
	work();
	return 0;
}
void init()
{
	cin>>m>>n;
	for(int i=1;i<=m*n;i++)f[i]=i;
	while(!cin.eof())
	{
		int x,y,x1,x2,y1,y2;
		cin>>x1>>y1>>x2>>y2;
		x=(x1-1)*n+y1;
		y=(x2-1)*n+y2;
		merge(x,y); 
	}
}
void work()
{
	int x,y;
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=m-1;j++)
	  {
	  	  x=(j-1)*n+i;
	  	  y=j*n+i;
	  	  x=find(x);
	  	  y=find(y);
	  	  if(x!=y)
	  	  {
	  		  tot++;
	  		  merge(x,y);
	  	  }
	  }
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n-1;j++)
		{
			x=(i-1)*n+j;
			y=x+1;
			x=find(x);
			y=find(y);
			if(x!=y)
			{
				tot+=2;
				merge(x,y);
			}
		}
	}
	cout<<tot<<endl;
}
int find(int x)
{
	if(f[x]==x)return x;
	f[x]=find(f[x]);
	return f[x];
}
void merge(int x,int y)
{
	x=find(x);
	y=find(y);
	f[y]=x;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值