HDU 1875(最小生成树)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1875(最小生成树)相关的知识,希望对你有一定的参考价值。
因为是全连接图,所以也可以用最小生成树
这道题给边加了一个限制条件,(10<=x<=1000),所以可能不能全连通,需要判断
#include <cstdio> #include <iostream> #include <queue> #include <cmath> using namespace std; #define sf scanf #define pf printf #define debug printf("!\n") #define blank printf("\n") #define mem(a,b) memset(a,b,sizeof(a)) const int MaxN = 110; const int INF = 1<<27; int p[MaxN]; int r[MaxN*MaxN],u[MaxN*MaxN],v[MaxN*MaxN]; double w[MaxN*MaxN]; int m,n,vex; struct point { int x,y; }; point pt[110]; int find(int x){return p[x]==x?x:p[x]=find(p[x]);} int cmp(const int a,const int b) { return w[a]<w[b]; } double kruskal() { double ans = 0; int i; for(i = 0;i<n;i++) p[i] = i; for(i = 0;i<m;i++) r[i] = i; sort(r,r+m,cmp); for(i = 0;i<m;i++) { int e = r[i]; int x = find(u[e]); int y = find(v[e]); if(x!=y) { ans+=w[e]; p[x] = y; vex++; } } return ans; } double getD(point p1 ,point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } int main() { int i,j,t; sf("%d",&t); while(t--) { mem(u,0); mem(v,0); mem(w,0); m=0; vex = 1; sf("%d",&n); for(i = 0;i<n;i++) { sf("%d%d",&pt[i].x,&pt[i].y); } for(i = 0;i<n;i++) { for(j=i+1;j<n;j++) { double d = getD(pt[i],pt[j]); if(d<10 || d>1000) { continue; } u[m] = i; v[m] = j; w[m++] = d; } } double ans = kruskal(); if(vex<n) pf("oh!\n"); else pf("%.1lf\n",ans*100); } return 0; }
以上是关于HDU 1875(最小生成树)的主要内容,如果未能解决你的问题,请参考以下文章