I and OI
Past...

1.Prim算法(POJ2560)

const maxn=101;
var   x,y,mindis:array[0..maxn] of extended;
      dis:array[0..maxn,0..maxn] of extended;
      vis:array[0..maxn] of boolean;
      n,i,j:longint;

      function calc(a,b:longint):extended;
      begin
            calc:=sqrt(sqr(x[a]-x[b])+sqr(y[a]-y[b]));
      end;

      procedure prim(root:longint);
      var   i,j,k:longint;
            min,sum:extended;
      begin
            sum:=0;
            fillchar(vis,sizeof(vis),0);
            vis[root]:=true;
            for i:=1 to n do mindis[i]:=dis[i,root];
            for i:=1 to n-1 do
            begin
                  min:=1e100;
                  for j:=1 to n do
                  if (not vis[j])and(mindis[j]<min) then
                  begin
                        min:=mindis[j];
                        k:=j;
                  end;
                  vis[k]:=true;
                  sum:=sum+min;
                  for j:=1 to n do
                  if (not vis[j])and(dis[j,k]<mindis[j]) then
                    mindis[j]:=dis[j,k];
            end;
            writeln(sum:0:2);
      end;


begin
      readln(n);
      for i:=1 to n do readln(x[i],y[i]);
      for i:=1 to n-1 do
         for j:=i+1 to n do
         begin
               dis[i,j]:=calc(i,j);
               dis[j,i]:=dis[i,j];
         end;

      Prim(1);
end.

2.Kruskal算法(POJ2485)

type  node=record
      u,v,w:longint;
end;
const oo=1000000;
var   e:array[0..260000] of node;
      f:array[0..510] of longint;
      n,d,datanum:longint;


      procedure sort(l,r:longint);
      var   i,j,mid:longint;
            temp:node;
      begin
            i:=l; j:=r;
            mid:=e[(l+r)>>1].w;
            repeat
                   while e[i].w<mid do inc(i);
                   while e[j].w>mid do dec(j);
                   if i<=j then
                   begin
                         temp:=e[i];
                         e[i]:=e[j];
                         e[j]:=temp;
                         inc(i); dec(j);
                   end;
            until i>j;
            if i<r then sort(i,r);
            if j>l then sort(l,j);
      end;

      procedure init;
      var   i,j,weight,ecount:longint;
      begin
            readln;
            readln(n);
            ecount:=0;
            for i:=1 to n do
            begin
                  for j:=1 to n do
                  begin
                       read(weight);
                       inc(ecount);
                       if weight=0 then weight:=oo;
                       e[ecount].w:=weight;
                       e[ecount].u:=i;
                       e[ecount].v:=j;
                  end;
                  readln;
            end;
            sort(1,n*n);
      end;

      function getf(x:longint):longint;
      begin
            if f[x]<>x then f[x]:=getf(f[x]);
            exit(f[x]);
      end;

      procedure union(u,v:longint);
      begin   f[u]:=v;   end;

      function kruskal:longint;
      var   i,count,max:longint;
      begin
            for i:=1 to n do f[i]:=i;
            count:=0;    max:=-oo;
            for i:=1 to n*n do
            begin
                  if count=n-1 then break;
                  if (getf(e[i].u)<>getf(e[i].v)) then
                  begin
                        inc(count);
                        if e[i].w>max then max:=e[i].w;
                        union(getf(e[i].u),getf(e[i].v));
                  end;
            end;
            exit(max);
      end;


begin
      readln(datanum);
      for d:=1 to datanum do
      begin
            init;
            writeln(kruskal);
      end;
end.

posted on 2011-08-07 20:18  exponent  阅读(246)  评论(0编辑  收藏  举报