codevs1003

题目地址:http://codevs.cn/problem/1003/

分析:

prim

代码:

const
  oo=10003;
var
  i,j,n,ans:integer;
  cost:longint;
  ansg:array[1..10000,1..2] of byte;
  g:array[1..100,1..100] of integer;
  d:array[1..100] of longint;
procedure prim;
var
  i,min,minp:integer;
  v:array[1..100] of boolean;
  pre:array[1..100] of integer;
begin
  for i:=1 to n do d[i]:=oo;
  d[1]:=0;
  fillchar(v,sizeof(v),false);
  fillchar(pre,sizeof(pre),0);
  for i:=1 to n do
  begin
    min:=oo;
    for j:=1 to n do
      if (not v[j])and(d[j]<min) then
      begin
        min:=d[j]; minp:=j;
      end;
    v[minp]:=true;
    if (pre[minp]<>0)and(g[pre[minp],minp]<>0) then
    begin
      inc(ans);
      inc(cost,g[pre[minp],minp]);
      if minp<pre[minp] then
        begin ansg[ans,1]:=minp; ansg[ans,2]:=pre[minp]; end
      else
        begin ansg[ans,1]:=pre[minp]; ansg[ans,2]:=minp; end;
    end;
    for j:=1 to n do
      if d[j]>g[minp,j] then
      begin
        d[j]:=g[minp,j];
        pre[j]:=minp;
      end;
  end;
end;
begin
  readln(n);
  for i:=1 to n do
  begin
    for j:=1 to n do
      read(g[i,j]);
    readln;
  end;
  ans:=0; cost:=0;
  prim;
  writeln(ans);
  for i:=1 to ans do
    writeln(ansg[i,1],' ',ansg[i,2]);
  writeln(cost);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值