#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 105;
const double inf = 100000000.0;
int n,m;
double dis[maxn];
bool vis[maxn];
struct Node
{
int x,y;
}node[maxn];
double getDist( int a,int b )
{
return sqrt( (( node[a].x - node[b].x ) * ( node[a].x - node[b].x ) + ( node[a].y - node[b].y )*( node[a].y - node[b].y ))*1.0);
}
void Prime( int s )
{
double dist,mins,ans = 0.0;
memset( vis,0,sizeof(vis) );
for( int i = 1; i <= n; i ++ )
{
dist = getDist(s,i);
if( dist >= 10.000000 && dist <= 1000.000001 )
dis[i] = dist;
else
dis[i] = inf;
}
vis[s] = true;
for ( int i = 1; i <= n; i ++ )
{
mins = inf;
int p = s;
for( int j = 1; j <= n; j ++ )
{
if ( !vis[j] && mins - dis[j] >= -0.0000001 )
{
mins = dis[p = j];
}
}
if( vis[p] )
continue;
ans += mins;
vis[p] = true;
for ( int j = 1; j <= n; j ++ )
{
dist = getDist(p,j);
if( dis[j] - dist > -0.0000001 && dist >= 10.000000 && dist <= 1000.000001 )
{
dis[j] = dist;
}
}
}
if( ans > inf )
puts("oh!");
else
printf("%.1lf\n", ans*100.0 );
}
int main()
{
//freopen("data.txt","r",stdin);
int t;
scanf("%d",&t);
while( t-- )
{
scanf("%d",&n);
for ( int i = 1; i <= n; i ++ )
{
scanf("%d%d",&node[i].x,&node[i].y);
}
Prime(1);
}
return 0;
}
HDU-1233 还是畅通工程 最小生成树Prime
最新推荐文章于 2021-07-28 18:33:02 发布