讨论 / 我想优化做 失败 求神牛助我
严宽2 2013-10-26 18:24:00
点我顶贴 收藏 删除
program hpny;

type dd=record

x,y,w:longint;

end;

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

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

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

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

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

procedure heap(tt,ii:longint);

var i1,j1,xx,xi,yi:longint;

begin

xx:=d[ii].w;xi:=d[ii].x;yi:=d[ii].y;

i1:=ii;j1:=ii*2;

while j1<=tt do

begin

if (j1<tt)and(d[j1].w>d[j1+1].w) then j1:=j1+1;

if xx>d[j1].w then

begin

d[i1].x:=d[j1].x;d[i1].y:=d[j1].y;d[i1].w:=d[j1].w;

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

end

else j1:=tt+1;

end;

d[i1].x:=xi;d[i1].y:=yi;d[i1].w:=xx;

end;

procedure insert(xi,yi:longint);

var xx,j1,i1:longint;

begin

d[t].x:=xi;d[t].y:=yi;d[t].w:=map[xi,yi];xx:=map[xi,yi];

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

while j1>=1 do

begin

if (j1>1)and(d[j1].w>d[j1+1].w) then j1:=j1+1;

if xx<d[j1].w then

begin

d[i1].x:=d[j1].x;d[i1].y:=d[j1].y;d[i1].w:=d[j1].w;

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

end

else j1:=0;

end;

d[i1].x:=xi;d[i1].y:=yi;d[i1].w:=xx;

end;

begin

readln(n);

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

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);

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

lowcost[1]:=0;

for i:=1 to first[1] do

begin

inc(t);

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

end;

flag[1]:=true;

for i:=2 to n do

begin

while flag[d[1].y]=true do

begin

d[1].x:=d[t].x;d[1].y:=d[t].y;d[1].w:=d[t].w;dec(t);

heap(t,1);

end;

lowcost[d[1].y]:=d[1].w;mj:=d[1].y;

min:=d[1].w;

flag[mj]:=true;inc(total,min);

d[1].x:=d[t].x;d[1].y:=d[t].y;d[1].w:=d[t].w;dec(t);

heap(t,1);

for j:=1 to first[mj] do

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

begin

inc(t);

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

end;

end;

writeln(total);

end.

#1 严宽2@2013-10-25 23:10:00
回复 删除
不用了

找到了,无语的错误

#2 严宽2@2013-10-26 18:24: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.

查看更多回复
提交回复