【prim】新的开始

=================================================================

prim:增加源点。

================

var
  n:longint;
  v:array[0..301]of longint;
  cost:array[0..301,0..301]of longint;
  l_cost:array[0..301]of longint;
  f_bo:array[0..301]of boolean;
  
procedure init;
begin
  assign(input,'newstart.in');
  assign(output,'newstart.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure main;
var
  i,j,i1:longint;
  n_cost:longint;
  min,k:longint;
  ans:longint;
begin
  readln(n);
  
  for i:=1 to n do read(v[i]);
  for i:=1 to n do
    for j:=1 to n do
      read(cost[i,j]);
      
  for i:=1 to n do
    begin
      cost[0,i]:=v[i];
      cost[i,0]:=v[i];
    end;

  ans:=maxlongint;
  for i:=1 to n do
    begin
      fillchar(l_cost,sizeof(l_cost),$7);
      for j:=1 to n do
       if i<>j then l_cost[j]:=cost[i,j];  {到i所在集合的距离}
       
      for j:=1 to n do
        if l_cost[j]>v[j] then l_cost[j]:=v[j]; {维护出j号单独修电机的费用}

      fillchar(f_bo,sizeof(f_bo),true);
      f_bo[i]:=false;
      
      n_cost:=cost[0,i];
      {==========================chushihua}
      for j:=1 to n-1 do                   {加入n-1条边,就可以连完所有点}
        begin
          min:=maxlongint;
          for i1:=1 to n do
            if (f_bo[i1])and(min>l_cost[i1]) then
              begin
                min:=l_cost[i1];
                k:=i1;
              end;
          n_cost:=n_cost+min;
          f_bo[k]:=false;
          for i1:=1 to n do
            if l_cost[i1]>cost[k,i1] then
              l_cost[i1]:=cost[k,i1];
        end;
        
      if ans>n_cost then ans:=n_cost;
    end;
  writeln(ans);
end;

begin
  init;
  main;
  terminate;
end.


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值