洛谷P2504 Prim做法30pts求条

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+10,inf=1e16;
int n,m;
int a[N];
double d[N][N],dis[N];
bool vis[N];
struct node{
	int x,y;
}p[N];
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]*=a[i];
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>p[i].x>>p[i].y;
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			d[i][j]=d[j][i]=(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y);
		}
	}
	for(int i=0;i<=n;i++) dis[i]=inf;
	dis[1]=0;
	for(int i=1;i<=n;i++){
		int u=0;
		for(int v=1;v<=n;v++)
			if(!vis[v] && dis[u]>dis[v]) u=v;
		vis[u]=1;
		for(int v=1;v<=n;v++){
			if(!vis[v]){
				if(d[u][v]<dis[v]){
					dis[v]=d[u][v];
				}
			}
		}
	}
	double ans=0;
	int res=0;
	for(int i=1;i<=n;i++) ans=max(ans,dis[i]);
	for(int i=1;i<=n;i++)
		if(a[i]>=ans) res++;
	cout<<res;
	return 0;
}

AC了2~4的数据点

我只会克鲁斯卡尔

注意区分n,m你的代码有点搞混了,其他应该没什么问题

谢谢老师已经AC了,以后还是按照题目给的变量命名吧

1 个赞

突然发现其实可以用克鲁斯卡尔做 :smiling_face_with_tear: