HDU 4463 最小生成树 裸题

来源:互联网 发布:凸优化 求解 编辑:程序博客网 时间:2024/06/05 03:37

2012杭州签到题。。。


#include "stdio.h"#include "string.h"#include "math.h"int main(){int hash[101];int w,i,j,n,a,b,k;double ans,min;double dis[101],map[101][101];int x[101],y[101];while (scanf("%d",&n)!=EOF){if (n==0) break;scanf("%d%d",&a,&b);for (i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);ans=(double) sqrt((double) (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));memset(hash,0,sizeof(hash));for (i=1;i<=n;i++)for (j=1;j<=n;j++)if (i==j) map[i][j]=0;else map[i][j]=(double) sqrt( (double) (x[i]-x[j])*(x[i]-x[j])+ (y[i]-y[j])*(y[i]-y[j]) );for (i=1;i<=n;i++)dis[i]=0x7fffffff;dis[a]=dis[b]=0;for (i=1;i<=n;i++){if (map[a][i]<dis[i]) dis[i]=map[a][i];if (map[b][i]<dis[i]) dis[i]=map[b][i];}w=n-2;memset(hash,0,sizeof(hash));hash[a]=hash[b]=1;while (w!=0){w--;min=0x7fffffff;for (i=1;i<=n;i++)if (hash[i]==0 && dis[i]<min){min=dis[i];k=i;}ans+=min;hash[k]=1;for (i=1;i<=n;i++)if (hash[i]==0 && map[k][i]<dis[i])dis[i]=map[k][i];}printf("%.2lf\n",ans);}return 0;}