题意:平面内有n个点,求最小生成树。
思路:就是最小生成树。。prim算法。不过我连图都没建,因为每两个点之间都是连通的,需要的时候算一下长度就好了。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <ctype.h>
using namespace std;
struct point{
double x;
double y;
};
point pt[110];
double dis[110];
bool vis[110];
double dist(point p1,point p2){
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
int main(){
int t;
cin>>t;
while(t--){
memset(vis,0,sizeof(vis));
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>pt[i].x>>pt[i].y;
}
for(int i=1;i<=n;i++){
dis[i]=dist(pt[1],pt[i]);
}
vis[1]=true;
double ans=0.0;
for(int k=1;k<n;k++){
double tmp=99999.9;
int key;
for(int i=1;i<=n;i++){
if(vis[i])continue;
if(dis[i]<tmp){
tmp=dis[i];
key=i;
}
}
ans+=dis[key];
vis[key]=true;
for(int i=1;i<=n;i++){
if(dist(pt[key],pt[i])<dis[i]){
dis[i]=dist(pt[key],pt[i]);
}
}
}
printf("%.2lf\n",ans);
if(t)cout<<endl;
}
return 0;
}