本题是稠密图所以选择Prim算法,需要注意的是对边的限制,不在指定范围的边都不能建:
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
#define INF 1200.0
int N, pos[100][2];
double map[100][100];
double low[100];
bool inq[100];
void input()
{
scanf("%d", &N);
for(int i = 0; i < N; ++i) scanf("%d %d", &pos[i][0], &pos[i][1]);
for(int i = 0; i < N; ++i){
inq[i] = false;
for(int j = i + 1; j < N; ++j){
map[i][j] = map[j][i] = sqrt(pow(pos[i][0] - pos[j][0], 2.0) + pow(pos[i][1] - pos[j][1], 2.0));
}
}
}
void prim()
{
double cost = 0.0, dis;
int i, j, x;
inq[0] = true;
for(i = 1; i < N; ++i) low[i] = (map[0][i] < 10.0 || map[0][i] > 1000.0) ? INF : map[0][i];
for(i = 1; i < N; ++i){
x = -1; dis = INF;
for(j = 0; j < N; ++j){
if(!inq[j] && low[j] < dis){
x = j;
dis = low[j];
}
}
if(x == -1) break;
cost += low[x];
inq[x] = true;
for(j = 0; j < N; ++j){
if(!inq[j] && !(map[x][j] < 10.0 || map[x][j] > 1000.0) && map[x][j] < low[j])
low[j] = map[x][j];
}
}
if(x < 0) puts("oh!");
else printf("%.1f\n", cost * 100);
}
int main()
{
int T;
for(scanf("%d", &T); T; --T){
input();
prim();
}
return 0;
}