最小生成树-Uva10034

Problem A: Freckles

In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to form a picture of the Liberty Bell. Alas, one of the freckles turns out to be a scar, so his Ripley's engagement falls through.

Consider Dick's back to be a plane with freckles at various (x,y) locations. Your job is to tell Richie how to connect the dots so as to minimize the amount of ink used. Richie connects the dots by drawing straight lines between pairs, possibly lifting the pen between lines. When Richie is done there must be a sequence of connected lines from any freckle to any other freckle.

Input

The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.

The first line contains 0 < n <= 100, the number of freckles on Dick's back. For each freckle, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the freckle.

Output

For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.

Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the freckles.

Sample Input

1

3
1.0 1.0
2.0 2.0
2.0 4.0


Sample Output

3.41


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const double INF=1000000000000.0;
struct node
{
double x,y;
} dian[150];
int n;
double grid[150][150];
double dist[150];
bool vis[150];
void prim()
{
for(int i=1; i<=n; i++)
{
dist[i]=grid[1][i];
vis[i]=false;
}
dist[1]=0;
vis[1]=true;
int x;
for(int i=1; i<n; i++)
{
double maxn=INF+10;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dist[j]<maxn)
{
maxn=dist[j];
x=j;
}
}
vis[x]=true;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dist[j]>grid[x][j])
{
dist[j]=grid[x][j];
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
double x,y;
for(int i=1; i<=n; i++)
fill(grid[i],grid[i]+n+1,INF);
for(int i=1; i<=n; i++)
{
cin>>dian[i].x>>dian[i].y;
for(int j=1; j<i; j++)
{
double dis=pow((dian[j].x-dian[i].x),2)+pow((dian[j].y-dian[i].y),2);
dis=sqrt(dis);
grid[i][j]=grid[j][i]=dis;
}
}
prim();
double ans=0;
for(int i=1; i<=n; i++)
ans+=dist[i];
printf("%.2lf\n",ans);
if(t!=0)
cout<<endl;
}
return 0;
}



• 本文已收录于以下专栏：

uva10034 最小生成树

#include #include #include #include #include #include #include using namespace std; const int...
• newbaby2012
• 2014年01月09日 20:45
• 403

UVA10034 - Freckles(最小生成树)

UVA10034 - Freckles(最小生成树) UVA10034 - Freckles 题目大意：  给你n个雀斑的位置，每个雀斑看作一个点，问使得这个雀斑相互连通的最短的路径长度...
• u012997373
• 2015年05月28日 20:09
• 495

uva10034

• vv494049661
• 2016年03月09日 21:00
• 240

UVa10034

• AClion
• 2013年01月25日 21:51
• 353

UVa10034/POJ2560_Freckles(最小生成树)(小白书图论专题)

• u013320038
• 2014年08月19日 09:33
• 2524

uva10034 Freckles

• deepquiet
• 2016年03月11日 13:40
• 116

uva10034 - Freckles

• a451907
• 2012年11月17日 00:43
• 115

uva10034(并查集)

• yeyeyeguoguo
• 2014年11月04日 21:53
• 278

最小生成树总结

• u013555159
• 2016年05月07日 12:13
• 849

比较好的题目“典型的最小生成树”

Watering Hole My Tags   (Edit)   Source : USACO 2008 Open  ...
• struggle_mind
• 2014年05月07日 21:33
• 1043

举报原因： 您举报文章：最小生成树-Uva10034 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)