G

jzx1020 / 2023-08-05 / 原文

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,fa[10000005],t,s1,a[10005][10005];
bool vis[10005][10005];
const short dx[]={1,0};
const short dy[]={0,1};
struct node{
	int u,v,w;
}e[10000005];
bool cmp(node a,node b){
	return a.w<b.w;
}
void init(){
	for(int i=1;i<=m*n;i++){
		fa[i]=i;
	}
}
bool merge(int a,int b){
	int q=fa[a];
	int p=fa[b];
	if(p==q)return 0;
	for(int i=1;i<=m*n;i++){
		if(fa[i]==p){
			fa[i]=q;
		}
	}
	return 1;
}
int kruskal(){
	int t1=m*n;
	int ans=0;
	stable_sort(e,e+cnt,cmp);
	for(int i=0;i<cnt;i++){
		if(merge(e[i].u,e[i].v)){
			t1--;
			if(vis[e[i].u][e[i].v])continue;
			ans+=e[i].w;
		}
		if(t1==1) return ans;
	}
	return 0;
}
int main(){
	cin>>m>>n;
	int x,y,xx,yy;
	t=0;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			t++;
			a[i][j]=t;
		}
	}
	while(cin>>x>>y>>xx>>yy){
		vis[a[x][y]][a[xx][yy]]=true;
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			for(int h=0;h<2;h++){
				int nx=i+dx[h];
				int ny=j+dy[h];
				if(nx<1||ny<1||nx>m||ny>n)continue;
				e[cnt].u=a[i][j];
				e[cnt].v=a[nx][ny];
				if(h==0)e[cnt].w=1;
				else e[cnt].w=2;
				cnt++;
			}
		}
	}
	init();
	int s=kruskal();
	cout<<s<<endl;
	return 0;
}