题意:给出n个点的坐标,两个点距离大于10小于1000可以建边,求最小生成树。
根据限定条件建图,跑一遍prim。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 220
#define INF 1e11
using namespace std;
double d[N],mp[N][N],x[N],y[N];
int n,v[N];
void prim()
{
for(int i=0;i<n;i++) d[i]=INF,v[i]=0;
d[0]=0;
for(int i=0;i<n;i++)
{
double mmin=INF;
int t=-1;
for(int j=0;j<n;j++)
if(!v[j]&&mmin>d[j])
mmin=d[t=j];
if(t==-1)
{
cout<<"oh!"<<endl;
return ;
}
v[t]=1;
for(int j=0;j<n;j++)
if(!v[j])
d[j]=min(d[j],mp[t][j]);
}
double ans=0;
for(int i=0;i<n;i++) ans+=d[i];
printf("%.1lf\n",ans*100);
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;i<n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
double t=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
if(t>=10&&t<=1000) mp[i][j]=t;
else mp[i][j]=INF;
}
prim();
}
}