25pts 求助
查看原帖
25pts 求助
511959
_Weslie_楼主2024/7/5 17:57
#include<bits/stdc++.h>
using namespace std;
int w[155][155];
struct node {
	int u,v,w;
} e[4000005];
int n,m,vis[155][155],cnt;
const int dx[]= {0,1,-1,1,-1,2,-2,2,-2};
const int dy[]= {0,2,2,-2,-2,1,1,-1,-1};
queue<int>q1,q2,q3;
void bfs(int s,int t) {
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++)vis[i][j]=0;
	}
	q1.push(s);
	q2.push(t);
	q3.push(0);
	while(!q1.empty()) {
		int x=q1.front(),y=q2.front(),t=q3.front();
		q1.pop(),q2.pop();
		q3.pop();
		if(vis[x][y])continue;
		vis[x][y]=1;
		w[x][y]=t;
		for(int i=1; i<=8; i++) {
			int nx=x+dx[i],ny=y+dy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&!vis[nx][ny]) {
				q1.push(nx);
				q2.push(ny);
				q3.push(t+1);
			}
		}
	}
}
int x[2005],y[2005],fa[155];
int cmp(node _,node __) {
	return _.w<__.w;
}
int findd(int now) {
	if(fa[now]==now)return now;
	return fa[now]=findd(fa[now]);
}
void vnion(int u,int v) {
	u=findd(u);
	v=findd(v);
	fa[u]=v;
}
int main() {
	cin>>m>>n;
	for(int i=1; i<=n; i++) {
		fa[i]=i;
	}
	for(int i=1; i<=m; i++) {
		cin>>x[i]>>y[i];
	}
	for(int i=1; i<=m; i++) {
		for(int k=1; k<=n; k++) {
			for(int l=1; l<=n; l++) {
				w[k][l]=2147483647;
			}
		}
		bfs(x[i],y[i]);
		for(int j=1; j<=m; j++) {
			e[++cnt].u=i;
			e[cnt].v=j;
			e[cnt].w=w[x[j]][y[j]]+1;
		}
	}
	sort(e+1,e+cnt+1,cmp);
	int tot=0;
	long long ans=0;
	for(int i=1; i<=cnt; i++) {
		int uu=findd(e[i].u),vv=findd(e[i].v);
		if(uu!=vv) {
			vnion(uu,vv);
			ans+=e[i].w;
			if(tot==n-1)break;
		}
	}
	cout<<ans;
	return 0;
}

Subtask 1、3 AC,其他全 WA。

2024/7/5 17:57
加载中...