我们新建一个0号点,作为水库的水源,到每个点的费用就是wi.
注意到每个点的水源只有一个,所以最后答案是一棵树.显然是最小生成树了.
code:
/**************************************************************
Problem: 1601
User: exponent
Language: Pascal
Result: Accepted
Time:100 ms
Memory:584 kb
****************************************************************/
const maxn=301;
oo=maxlongint>>1;
var mind:array[0..maxn] of longint;
d:array[0..maxn,0..maxn] of longint;
vis:array[0..maxn] of boolean;
n,i,j,w:longint;
procedure prim(root:longint);
var i,j,k,min,sum:longint;
begin
sum:=0;
fillchar(vis,sizeof(vis),0);
vis[root]:=true;
for i:=1 to n do mind[i]:=d[i,root];
for i:=1 to n do
begin
min:=oo;
for j:=1 to n do
if (not vis[j])and(mind[j]<min) then
begin
min:=mind[j];
k:=j;
end;
vis[k]:=true;
sum:=sum+min;
for j:=1 to n do
if (not vis[j])and(d[j,k]<mind[j]) then
mind[j]:=d[j,k];
end;
writeln(sum);
end;
begin
readln(n);
for i:=1 to n do
begin
readln(w);
d[0,i]:=w;
d[i,0]:=w;
end;
for i:=1 to n do
begin
for j:=1 to n do
begin
read(d[i,j]);
if d[i,j]=0 then d[i,j]:=oo;
end;
readln;
end;
Prim(0);
end.
浙公网安备 33010602011771号