您的位置:首页 > 产品设计 > UI/UE

HDU-1875 最小生成树 PRIM

2012-04-19 19:51 357 查看
简单小题,没什么好说的。

/*
* hdu-1875
* mike-w
* 2012-4-19
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX_SIZE 128
#define INF (1e20)
#ifndef true
#define true (1)
#endif
#define EPS (1e-5)

double lake[MAX_SIZE][2];
double f[MAX_SIZE][MAX_SIZE];
double dst[MAX_SIZE];
int tag[MAX_SIZE];
int T,N;

int build_graph(void)
{
int i,j;
double dx,dy,dd;
for(i=0;i<N;i++)
for(j=i;j<N;j++)
{
dx=lake[i][0]-lake[j][0];
dy=lake[i][1]-lake[j][1];
dd=sqrt(dx*dx+dy*dy);
if(dd>=10.0 && dd<=1000.0)
f[i][j]=f[j][i]=dd*100.0;
else
f[i][j]=f[j][i]=INF;
}
return 0;
}

double prim(void)
{
int i,x,fail;
double cost;
for(i=0;i<N;i++)
tag[i]=0,dst[i]=INF;
dst[0]=0;
fail=0;
cost=0.0;
while(true)
{
/* extract mininal */
x=-1;
for(i=0;i<N&&tag[i];i++)
;
for(x=i++;i<N;i++)
if(!tag[i] && dst[i]<dst[x])
x=i;
if(x>=N || fabs(dst[x]-INF)<EPS)
break;
/* update */
tag[x]=1;
cost+=dst[x];
for(i=0;i<N;i++)
if(!tag[i] && f[x][i]<INF && f[x][i]<dst[i])
dst[i]=f[x][i];
}
for(i=0;i<N;i++)
if(!tag[i])
fail=1,i=N;
return fail?-1.0:cost;
}

int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int i;
double cost;
scanf("%d",&T);
while(T-->0)
{
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%lf%lf",lake[i],lake[i]+1);
build_graph();
cost=prim();
if(cost<0)
puts("oh!");
else
printf("%.1lf\n",cost);
}
return 0;
}

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