35pts求助
查看原帖
35pts求助
1183074
xzy_AK_IOI楼主2024/8/24 11:12
#include<bits/stdc++.h>
using namespace std;
const int N=2e3+100;
const int M=2e2+10;
int step[M][M];
int mp2[M][M];
bool k[M][M];
int _x[N],_y[N];
int s[N];
int o[10]={1,2,-1,-2,1,2,-1,-2};
int u[10]={-2,-1,2,1,2,1,-2,-1};
struct edge{
	int from,to,w;
};
struct node{
	int x,y;
};
bool cmp(edge a,edge b){
	return a.w<b.w;
}
int find_set(int x){
	if (x!=s[x]){
		s[x]=find_set(s[x]);
	}
	return s[x];
}
edge e[N*N];
int n,m,sum;
void mem(){
	for (int i=0;i<=n+10;i++)
		for (int j=0;j<=n+10;j++)
			step[i][j]=k[i][j]=0;
}
void Kruskal(){
	sort(e+1,e+1+sum,cmp);
	for (int i=1;i<=n;i++) s[i]=i;
	int ans=0,cnt=0;
	for (int i=1;i<=sum;i++){
		if (cnt==n-1) break;
		int e1=find_set(e[i].from);
		int e2=find_set(e[i].to);
		if (e1==e2) continue;
		s[e1]=e2;
		ans+=e[i].w;
		cnt++;
	}
	cout<<ans+n-1;
}
void bfs(int r){
	queue <node> q;mem();
	k[_x[r]][_y[r]]=1;
	q.push((node){_x[r],_y[r]});
	while (!q.empty()){
		node v=q.front();q.pop();
		for (int i=0;i<=7;i++){
			int x2=v.x+o[i],y2=v.y+u[i];
			if (x2<=0 || y2<=0 || x2>m || y2>m || k[x2][y2]) continue;
			if (mp2[x2][y2]) e[++sum]=(edge){r,mp2[x2][y2],step[v.x][v.y]+1};
			k[x2][y2]=1;
			step[x2][y2]=step[v.x][v.y]+1;
			q.push((node){x2,y2});
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for (int i=1;i<=n;i++){
		cin>>_x[i]>>_y[i];
		mp2[_x[i]][_y[i]]=i;
	}
	for (int i=1;i<=n;i++){
		bfs(i);
	}
	//for (int i=1;i<=sum;i++) cout<<e[i].from<<" "<<e[i].to<<' '<<e[i].w<<'\n';
	Kruskal();
	return 0;
}
2024/8/24 11:12
加载中...