//
prim算法
#include < iostream >
#include < stdio.h >
#include < string .h >
#include < math.h >
using namespace std;
int T, C, heap_size;
double map[ 100 ][ 100 ];
double V[ 100 ][ 100 ];
pair < double , int > heap[ 100 ]; // first保存距离,second保存岛的编号
void up( int i)
{
while (i > 1 && heap[i].first < heap[i / 2 ].first) {
swap(heap[i], heap[i / 2 ]);
i /= 2 ;
}
}
void down( int i)
{
int j = i * 2 ;
while (j <= heap_size) {
if (j < heap_size && heap[j].first > heap[j + 1 ].first)
j ++ ;
if (heap[i].first <= heap[j].first)
break ;
swap(heap[i], heap[j]);
i = j;
j *= 2 ;
}
}
int main()
{
scanf( " %d " , & T);
while (T -- ) {
scanf( " %d " , & C);
double sum = 0 ;
heap_size = C - 1 ;
for ( int i = 0 ; i < C; ++ i) {
scanf( " %lf%lf " , & V[i][ 0 ], & V[i][ 1 ]);
for ( int j = 0 ; j < i; ++ j) {
double distmp =
sqrt((V[i][ 0 ] - V[j][ 0 ]) * (V[i][ 0 ] - V[j][ 0 ]) +
(V[i][ 1 ] - V[j][ 1 ]) * (V[i][ 1 ] - V[j][ 1 ]));
if (distmp >= 10 && distmp <= 1000 )
map[i][j] = map[j][i] = distmp;
else
map[i][j] = map[j][i] = 1000000 ;
}
}
// init heap
for ( int i = 1 ; i < C; ++ i) {
heap[i].first = map[ 0 ][i];
heap[i].second = i;
}
for ( int i = C / 2 ; i; -- i)
down(i);
for ( int i = 1 ; i < C; ++ i) {
int u = heap[ 1 ].second;
sum += heap[ 1 ].first;
heap[ 1 ] = heap[heap_size];
heap_size -- ;
down( 1 );
for ( int j = 1 ; j <= heap_size; ++ j) {
if (heap[j].first > map[u][heap[j].second]) {
heap[j].first = map[u][heap[j].second];
up(j);
}
}
}
if (sum > (C - 1 ) * 1000 )
printf( " oh!\n " );
else
printf( " %.1lf\n " , sum * 100 );
}
}
#include < iostream >
#include < stdio.h >
#include < string .h >
#include < math.h >
using namespace std;
int T, C, heap_size;
double map[ 100 ][ 100 ];
double V[ 100 ][ 100 ];
pair < double , int > heap[ 100 ]; // first保存距离,second保存岛的编号
void up( int i)
{
while (i > 1 && heap[i].first < heap[i / 2 ].first) {
swap(heap[i], heap[i / 2 ]);
i /= 2 ;
}
}
void down( int i)
{
int j = i * 2 ;
while (j <= heap_size) {
if (j < heap_size && heap[j].first > heap[j + 1 ].first)
j ++ ;
if (heap[i].first <= heap[j].first)
break ;
swap(heap[i], heap[j]);
i = j;
j *= 2 ;
}
}
int main()
{
scanf( " %d " , & T);
while (T -- ) {
scanf( " %d " , & C);
double sum = 0 ;
heap_size = C - 1 ;
for ( int i = 0 ; i < C; ++ i) {
scanf( " %lf%lf " , & V[i][ 0 ], & V[i][ 1 ]);
for ( int j = 0 ; j < i; ++ j) {
double distmp =
sqrt((V[i][ 0 ] - V[j][ 0 ]) * (V[i][ 0 ] - V[j][ 0 ]) +
(V[i][ 1 ] - V[j][ 1 ]) * (V[i][ 1 ] - V[j][ 1 ]));
if (distmp >= 10 && distmp <= 1000 )
map[i][j] = map[j][i] = distmp;
else
map[i][j] = map[j][i] = 1000000 ;
}
}
// init heap
for ( int i = 1 ; i < C; ++ i) {
heap[i].first = map[ 0 ][i];
heap[i].second = i;
}
for ( int i = C / 2 ; i; -- i)
down(i);
for ( int i = 1 ; i < C; ++ i) {
int u = heap[ 1 ].second;
sum += heap[ 1 ].first;
heap[ 1 ] = heap[heap_size];
heap_size -- ;
down( 1 );
for ( int j = 1 ; j <= heap_size; ++ j) {
if (heap[j].first > map[u][heap[j].second]) {
heap[j].first = map[u][heap[j].second];
up(j);
}
}
}
if (sum > (C - 1 ) * 1000 )
printf( " oh!\n " );
else
printf( " %.1lf\n " , sum * 100 );
}
}