水题
先求两两间的长度,再求最小生成树
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define BUG puts("HERE!")
using namespace std;
const int MAX = 105;
const double INF = 0x7fffff;
const double eps = 1e-5;
const double PI = 3.14159265358979323846;
double dis[MAX][MAX], x[MAX], y[MAX];
double dist[MAX];
int t, c;
double d, l;
bool vis[MAX];
double prim(int n) {
int i,j,pos;
double sum=0,min;
memset(vis,false,sizeof(vis));
for(i=1; i<=n; i++) {
dist[i]=dis[1][i];
}
vis[1] = true;
dist[1] = INF;
for(i=1; i<n; i++) {
min = INF;
for(j = 1; j <= n; j++) {
if(!vis[j] && dist[j] < min) {
min = dist[j];
pos = j;
}
}
sum += dist[pos];
vis[pos] = true;
for(j = 1; j <= n; j++) {
if(!vis[j] && dist[j] > dis[pos][j]) {
dist[j] = dis[pos][j];
}
}
}
return sum;
}
double dd(double x1, double y1, double x2, double y2){
return fabs(d / 2 *acos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2)));
}
int main(int argc, char const *argv[]){
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
#endif
cin >> t;
while (t --){
cin >> d >> l >> c;
for (int i = 1; i <= c; ++i){
cin >> x[i] >> y[i];
x[i] = x[i] * PI / 180.0;
y[i] = y[i] * PI / 180.0;
}
for (int i = 1; i <= c; ++i){
for (int j = 1; j <= c; ++j){
if(i == j)
dis[i][j] = 0;
else
dis[i][j] = dd(x[i], y[i], x[j], y[j]);
}
}
double ans = prim(c);
if(ans < l)
puts("Y");
else
puts("N");
}
return 0;
}