POJ 2560Freckles(并查集)

来源:互联网 发布:元数据管理工具 编辑:程序博客网 时间:2024/05/16 10:24

题意:

找出一条最短路,额…….n<100;

思路:

并查集最短路搞一波,然后就没了….

时间复杂度

O(**

type  arr=record  x,y:longint;  w:real; end;const maxn=100;var a:array [0..maxn*maxn] of arr; f:array [0..maxn*maxn] of longint; x,y:array [0..maxn*maxn] of real; i,j,n,m,p:longint; ans:real;procedure qsort(l,r:longint);var i,j:longint; mid:real;begin i:=l; j:=r; mid:=a[(l+r) div 2].w; while i<j do begin  while a[i].w<mid do inc(i);  while a[j].w>mid do dec(j);  if i<=j then  begin   a[0]:=a[i];   a[i]:=a[j];   a[j]:=a[0];   inc(i); dec(j);  end; end; if i<r then qsort(i,r); if l<j then qsort(l,j);end;function father(x:longint):longint;var i,j:longint;begin if x<>f[x] then father:=father(f[x])            else father:=x; f[x]:=father;end;begin readln(n); for i:=1 to n do   readln(x[i],y[i]); for i:=1 to n do  for j:=1 to n do  begin   inc(p);   a[p].w:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));   a[p].x:=i;   a[p].y:=j;  end; qsort(1,p); for i:=1 to p do  f[i]:=i; for i:=1 to p do  if f[father(a[i].x)]<>f[father(a[i].y)] then  begin   f[father(a[i].x)]:=f[father(a[i].y)];   ans:=ans+a[i].w;  end; writeln(ans:0:2);end.
0 0