版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wlh1998/article/details/76034141
#include<stdio.h>
#include<string.h>
#include<math.h>
const int INF = 0x3f3f3f3f;
const int maxn = 1e3;
double mp[maxn][maxn]; // 存图;
int vis[maxn]; //是否在新图内;
double dis[maxn]; //第i个顶点到新图最短距离;
double prim(int n);
struct node{
double x;
double y;
}nodes[maxn];
int n,m;
int main (){
int t;
scanf("%d",&t);
int cun1,cun2,cost;
double ans = 0;
for (int cas = 0; cas < t; cas++){
scanf("%d", &m);
memset(mp,0x3f,sizeof(mp));
for (int i = 0; i < m; i++){
scanf("%lf%lf", &nodes[i].x ,&nodes[i].y);
}
for (int i = 0; i < m; i++){
for (int j = 0; j < m; j++){
mp[i][j] =sqrt((nodes[i].x - nodes[j].x) *(nodes[i].x - nodes[j].x) +
(nodes[i].y - nodes[j].y) *(nodes[i].y - nodes[j].y)) ;
if (mp[i][j] < 10 || mp[i][j] > 1000){
mp[i][j] = INF;
}
}
}
ans = prim(m);
if (ans == -1) printf("oh!\n");
else printf("%.1f\n",ans*100);
}
}
double prim(int n){
double ans = 0;
memset(vis,0,sizeof(vis));
vis[0] = 1; //注意第一个点的初始化;
for (int i = 0; i < n; i++) dis[i] = mp[0][i]; // 新图第一个点为0,初始化dis;
for (int i = 1; i < n; i++){ // 加入第i+1个点
double minn = INF; // 旧图到新图最短距离
int pos = -1; // 旧图最近点标号;
for (int j = 0; j < n; j++){
if(!vis[j] && minn > dis[j]) {
minn = dis[j];
pos = j;
}
}
if (minn == INF) return -1;
ans += minn; //更新答案;
vis[pos] = 1;
for (int j = 0; j < n; j++) {
if (!vis[j] && mp[pos][j] < dis[j]){
dis[j] = mp[pos][j];
}
}
}
return ans;
}