HDU 4463 最小生成树 并查集
2012-11-29 17:23
274 查看
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int maxn=55; struct point { int x,y; }pnt[maxn]; struct edge { int s,e; double len; bool operator < (edge e) const { return len < e.len; } }e[maxn*maxn]; int father[maxn]; double getlen(point a,point b) { return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ); } int find(int x) { if(father[x]==x) { return x; } return find(father[x]); } int main() { int n; while(~scanf("%d",&n),n) { int i,j,p,q; scanf("%d%d",&p,&q); int ne=0; for(i=1;i<=n;i++) { scanf("%d%d",&pnt[i].x,&pnt[i].y); for(j=1;j<i;j++) { e[ne].s=i; e[ne].e=j; e[ne++].len=getlen(pnt[i],pnt[j]); } } sort(e,e+ne); for(i=1;i<=n;i++) { father[i]=i; } double ans=getlen(pnt[p],pnt[q]); father[p]=q; int u,v; for(i=0;i<ne;i++) { u=find(e[i].s); v=find(e[i].e); if(u!=v) { ans += e[i].len; father[u] = v; } } printf("%.2lf\n",ans); } return 0; }
相关文章推荐
- HDU 4463--最小生成树+并查集标记
- hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集
- hdu 1102 最小生成树 prim算法+Kruskal算法(并查集)
- HDU 1233 (最小生成树) 用并查集实现kruskal
- 【HDU 4463 Outlets】最小生成树(prim,kruscal都可)
- 畅通工程 hdu 1863 最小生成树+并查集 浙大计算机研究生复试上机考试-2007年
- hdu 1233 还是畅通工程 (最小生成树,prim,优先队列,kruskal并查集)
- HDU 1232(最小生成树;并查集)
- HDU1879 并查集和最小生成树
- 【解题报告】 HDU 1102 Constructing Roads -- 并查集 最小生成树 Prime算法
- HDU-1301 Jungle Roads 并查集/最小生成数
- HDU-4463 Outlets 最小生成树
- hdu1879 继续畅通工程(最小生成树、 并查集)
- HDU 1233 还是畅通工程 (最小生成树、并查集)
- HDU 1233 还是畅通工程 最小生成树Kruskal算法/并查集
- HDU 4463 Outlets 最小生成树
- HDU 4463 Outlets (最小生成树)
- HDU 1233(最小生成树,并查集)
- hdu 4463 Outlets (最小生成树)
- hdu 4463 Outlets(最小生成树)