最小生成树kruscal+并查集

program as;
type
  t1     =record
  x,y,h  :longint;
end;
var
  n,m,s,i:longint;
  a      :array[1..1000000] of t1;
  f      :array[0..1000000] of longint;
  bool   :array[1..1000,1..1000] of boolean;
  sum    :longint;
  totel  :longint;
function find(x:longint):longint;
begin
  if x<>f[x] then
    begin
      f[x]:=find(f[x]);
      exit(f[x]);
    end
  else
  exit(x);
end;
procedure kuai(l,r:longint);
var
  i,j,x     :longint;
  y         :t1;
begin
  i:=l; j:=r;
  x:=a[(l+r) div 2].h;
  repeat
    while a[i].h<x do inc(i);
    while a[j].h>x do dec(j);
    if i<=j then
      begin
        y:=a[i];
        a[i]:=a[j];
        a[j]:=y;
        inc(i);
        dec(j);
      end;
  until i>j;
  if i<r then kuai(i,r);
  if l<j then kuai(l,j);
end;
procedure duru;
var
  i,j,x1  :longint;
begin
  read(n);
  s:=0;
  fillchar(a,sizeof(a),0);
  fillchar(bool,sizeof(bool),true);
  for i:=1 to n do
    for j:=1 to n do
     begin
       read(x1);
       if (i<>j)and(bool[i,j]) then
       begin
         inc(s);
         a[s].x:=i;
         a[s].y:=j;
         a[s].h:=x1;
         bool[i,j]:=false;
         bool[j,i]:=false;
       end;
     end;
end;
procedure kruscal;
var
  x,y,i,j :longint;
begin
  for i:=1 to s do
    f[i]:=i;
  for i:=1 to s do
    begin
      x:=find(a[i].x);
      y:=find(a[i].y);
      if x<>y then
        begin
          f[x]:=y;
          inc(sum,a[i].h);
          inc(totel);
        end;
      if totel=n-1 then
        exit;
    end;
end;
begin
  duru;
  kuai(1,s);
  kruscal;
  writeln(sum);

end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值