讨论 / 求帮助
严宽2 2013-10-26 18:26:00
点我顶贴 收藏 删除
还是不行啊

下面的离答案总差一点

求解!!!

program prim_yan;

var i,j,n,m,k,t,tot,mj,min:longint;

d:array[1..10000]of longint;

map,chart:array[1..100,1..100]of longint;

first,lowcost:array[1..100]of longint;

flag:array[1..100]of boolean;

procedure heap(nn,xi:longint);

var i1,j1,xx:longint;

begin

xx:=d[xi];

i1:=xi;j1:=2*xi;

while j1<=nn do

begin

if (j1<n)and(lowcost[d[j1]]>lowcost[d[j1+1]]) then j1:=j1+1;

if lowcost[xx]>lowcost[d[j1]] then

begin

d[i1]:=d[j1];i1:=j1;j1:=i1*2;

end

else j1:=nn+1;

end;

d[i1]:=xx;

end;

procedure insert(xi,yi:longint);

var i1,j1,xx:longint;

begin

d[t]:=yi;i1:=t;j1:=i1 div 2;

while j1>=1 do

begin

if lowcost[d[j1]]>lowcost[yi] then

begin

i1:=j1;j1:=i1 div 2;

end

else j1:=0;

end;

d[i1]:=yi;

end;

begin

assign(input,'hpny.in');

reset(input);

assign(output,'hpny.out');

rewrite(output);

readln(n);

fillchar(first,sizeof(first),0);

fillchar(lowcost,sizeof(lowcost),$5F);

for i:=1 to n do

begin

for j:=1 to n do

begin

read(map[i,j]);

if i<>j then

begin

inc(first[i]);chart[i,first[i]]:=j;

end;

end;

readln;

end;

t:=0;fillchar(flag,sizeof(flag),false);

lowcost[1]:=0;flag[1]:=true;

for i:=1 to first[i] do

begin

lowcost[chart[1,i]]:=map[1,chart[1,i]];

inc(t);

insert(1,chart[1,i]);

end;

for i:=2 to n do

begin

while flag[d[1]]=true do

begin

d[1]:=d[t];dec(t);

heap(t,1);

end;

flag[d[1]]:=true;mj:=d[1];

inc(tot,lowcost[mj]);

d[1]:=d[t];dec(t);

heap(t,1);

for j:=1 to first[mj] do

begin

if (not flag[chart[mj,j]])and(lowcost[chart[mj,j]]>map[mj,chart[mj,j]]) then

begin

lowcost[chart[mj,j]]:=map[mj,chart[mj,j]];

inc(t);

insert(mj,chart[mj,j]);

end;

end;

end;

writeln(tot);

close(input);close(output);

end.

本人找不出来那里的问题

#1 严宽2@2013-10-26 18:26:00
回复 删除
这是进行优化后的

只是想试一下优化,结果悲惨失败

对比一下不优化的

program hapy;

var

d:array[1..1000]of longint;

chart:array[1..1000]of boolean;

i,j,min,n,ans,k:longint;

w:array[1..1000,1..1000]of longint;

begin

fillchar(chart,sizeof(chart),false);

readln(n);

for i:=1 to n do

for j:=1 to n do

read(w[i,j]);

for i:=2 to n do d[i]:=maxlongint;

d[1]:=0;ans:=0;

for i:=1 to n do

begin

min:=maxlongint;

for j:=1 to n do

if not chart[j] and (d[j]<min) then begin k:=j;min:=d[j];end;

if min=maxlongint then begin ans:=-1;break;end;

ans:=ans+min;chart[k]:=true;

for j:=1 to n do

if w[k,j]<d[j] then d[j]:=w[k,j];

end;

writeln(ans);

readln;readln;

end.

查看更多回复
提交回复