hdu1162最小生成树
来源:互联网 发布:oracle数据库设置密码 编辑:程序博客网 时间:2024/06/05 14:29
/* Made by Karen 16:40p.m. at Mar.4,2012 prim算法求最小生成树 同hdu1875 而且在main函数里面的处理更简单*/#include <iostream>#include <cstdio>#include <math.h>using namespace std;#define MAX_Point 110#define MAX_Edge 12100#define INF 99999999double arr_list[110][110];struct point{ double x; double y;}point[MAX_Point];struct Edge{ int pointer; double lowcost; int flag;}edge[MAX_Edge];double prim(int n){ int i,j,k=1,flag; double min,sum2=0; j=1; for(i=1;i<=n;i++) { edge[i].pointer=i; edge[i].lowcost=arr_list[j][i]; edge[i].flag=0; } edge[j].flag=1; edge[j].lowcost=0; for(i=2;i<=n;i++) { k=1; min=INF; flag=0; for(j=2;j<=n;j++) { if(edge[j].flag==0&&edge[j].lowcost<min) { k=j; min=edge[j].lowcost; flag=1; } } if(!flag) return -1; edge[k].flag=1; sum2+=min; for(j=2;j<=n;j++) { if(edge[j].flag==0&&arr_list[k][j]<edge[j].lowcost) { edge[j].pointer=k; edge[j].lowcost=arr_list[k][j]; } } } return sum2;}int main(){ int n,i,j; double tmp,ans; while(scanf("%d",&n)!=EOF) { for(i=0;i<=100;i++) for(j=0;j<=100;j++) arr_list[i][j]=INF; for(i=1;i<=n;i++) scanf("%lf%lf",&point[i].x,&point[i].y); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { tmp=sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y)); arr_list[i][j]=tmp; } ans=prim(n); printf("%.2lf\n",ans); } return 0;}