标签:
http://poj.org/problem?id=2349
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 12544 | Accepted: 4097 |
Description
Input
Output
Sample Input
1 2 4 0 100 0 300 0 600 150 750
Sample Output
212.13
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<ctype.h> #define INF 0x3f3f3f3f #define max(a, b)(a > b ? a : b) #define min(a, b)(a < b ? a : b) #define N 510 using namespace std; struct st { int x, y; } node[N]; double G[N][N], dist[N]; int n; bool vis[N]; void Init() { int i, j; memset(vis, false, sizeof(vis)); for(i = 0 ; i < n ; i++) { for(j = 0 ; j < n ; j++) { if(i == j) G[i][j] = 0; G[i][j] = G[j][i] = INF; } } } void prim(int s) { int index, i, j; double Min; for(i = 0; i < n ; i++) dist[i] = G[s][i]; vis[s] = true; for(i = 1 ; i < n ; i++) { Min = INF; for(j = 0 ; j < n ; j++) { if(!vis[j] && dist[j] < Min) { Min = dist[j]; index = j; } } vis[index] = true; for(j = 0 ; j < n ; j++) { if(!vis[j] && dist[j] > G[index][j]) dist[j] = G[index][j]; } } } int cmp(const void *a, const void *b) { return *(double *)a > *(double *)b ? 1 : -1; }//double类型快排,因为这wa了很多次 int main() { int i, j, s, t; scanf("%d", &t); while(t--) { scanf("%d%d", &s, &n); Init(); for(i = 0 ; i < n ; i++) scanf("%d%d", &node[i].x, &node[i].y); for(i = 0 ; i < n ; i++) { for(j = 0 ; j < n ; j++) { G[i][j] = G[j][i] = sqrt((node[i].x - node[j].x) * (node[i].x - node[j].x) + (node[i].y - node[j].y) * (node[i].y - node[j].y)); } } prim(0); qsort(dist, n, sizeof(dist[0]), cmp); printf("%.2f\n", dist[n - s]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/qq2424260747/p/4681874.html