您的位置:首页 > 其它

hdu 1162

2016-08-24 20:20 141 查看
include<cstdio>
#include<iostream>
#include<string.h>
#include<cmath>
#define maxn 105
#define inf 9999999
struct node
{
double x,y;
}stu[maxn];
int vis[maxn],n;//用来表示点是否在集合里
double mincost[maxn];//用来记录从集合出来到每个点的最小距离
double mapp[maxn][maxn];
using namespace std;
double get_len(node a,node b)
{
return sqrt(pow(a.x-b.x,2.0)+pow(a.y-b.y,2.0));
}
void build_map()
{
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
double len=get_len(stu[i],stu[j]);
mapp[i][j]=mapp[j][i]=(i==j)?0:len;
}
}
}
void init()
{
memset(vis,0,sizeof(vis));
}
double minn(double x,double y)
{
if(x-y>0) return y;
else return x;
}
void prim()
{
fill(mincost,mincost+n+1,inf);
mincost[1]=0;
double res=0;
while(1)
{
int v=-1;
for(int i=1;i<=n;i++)    if(!vis[i]&&(v==-1||mincost[i]<mincost[v])) v=i;//找出离集合最近的点
        if(v==-1) break;
vis[v]=1;
res+=mincost[v];
for(int i=1;i<=n;i++) mincost[i]=minn(mincost[i],mapp[v][i]);
}
printf("%.2f\n",res);
}
int main()
{
while(~scanf("%d",&n))
{
init();
for(int i=1;i<=n;i++) scanf("%lf %lf",&stu[i].x,&stu[i].y);
build_map();
prim();

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: