思路: 题目要求一个城市只能选择一个离它最近的城市修建道路,所以不能使用kruscal算法,因为kruscal算法是以边为中心,按照kruscal算法来做的话,只要边足够小,一个城市就可以往多个城市修建道路,这显然不符合题意,所以考虑使用prim算法。具体实现如下:
Code:
constexpr int N=2e5+5,mod=1e9+7;
int n;
double dist[N];
PII q[N];
bool st[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;cin>>x>>y;
q[i]={x,y};
dist[i]=1e18;
}
dist[0]=1e18;
dist[1]=0;
double sum=0;
for(int i=1;i<=n;i++)
{
int v=0;
for(int j=1;j<=n;j++)
{
if(!st[j]&&dist[j]<dist[v])
{
v=j;
}
}
sum+=dist[v];
st[v]=true;
for(int j=1;j<=n;j++)
{
if(!st[j])
{
dist[j]=min(dist[j],sqrt((1.0*q[j].first-q[v].first)*(q[j].first-q[v].first)+(1.0*q[j].second-q[v].second)*(q[j].second-q[v].second)));
}
}
}
printf("%.2lf",sum);
}