讨论 / 求高手指点,过程中难道不能开过大数组吗???
604491113 2013-10-11 02:50:00
点我顶贴 收藏 删除
请看下面两个程序(不大美观,请不要介意)

{此程序参考的是 rain1994 ;在此也对其表达感谢}

*********************************

program trade;

var i,j,k,m,n,x,y,z,l,max,min:longint;

a,f1,f2,dist,head,head1:array[0..100000]of longint;

e,e1,next,next1:array[0..500000]of longint;

procedure spfa(s:longint);

var i,j,k,p,q:longint;

d:array[0..500000]of longint;

b:array[0..100000]of boolean;

begin

fillchar(dist,sizeof(dist),0);

fillchar(d,sizeof(d),0);

fillchar(b,sizeof(b),false);

dist[s]:=1;d[1]:=s;b[s]:=true;

p:=1;q:=1;

repeat

i:=head[d[p]];

while i<>0 do

begin

if (dist[e[i]]=0)and(dist[d[p]]=1) then

begin

dist[e[i]]:=1;

if not b[e[i]] then

begin

inc(q);

d[q]:=e[i];

end;

end;

i:=next[i];

end;

b[d[p]]:=false;

inc(p);

until p>q;

end;

begin

readln(n,m);

for i:=1 to n do read(a[i]);

for i:=1 to m do

begin

readln(x,y,z);

inc(j);

e[j]:=y;e1[j]:=x;

next[j]:=head[x];next1[j]:=head1[y];

head[x]:=j;head1[y]:=j;

if z=2 then

begin

inc(j);

e[j]:=x;e1[j]:=y;

next[j]:=head[y];next1[j]:=head1[x];

head[y]:=j;head1[x]:=j;

end;

end;

m:=j;

spfa(1);

f1:=dist;f1[1]:=0;f1[n]:=0;

e:=e1;next:=next1;head:=head1;

spfa(n);

f2:=dist;f2[1]:=0;f2[n]:=0;

max:=0;min:=1000;

for i:=1 to n do

begin

if (f1[i]=1)and(f2[i]=1) then

begin

if a[i]>max then max:=a[i];

if a[i]<min then min:=a[i];

end;

end;

if (max=min)or(max=0)or(min=1000) then write(0)

else write(max-min);

end.

在rqnoj里面确实是可以ac,但是不知道为什么,在pascal中会出现栈溢出,在多台校方多台评测机上也是同样情况,但是如果稍作改动

******************************************

program trade;

var i,j,k,m,n,x,y,z,l,max,min:longint;

a,f1,f2,dist,head,head1:array[0..100000]of longint;

e,e1,next,next1:array[0..500000]of longint;

d:array[0..500000]of longint;

b:array[0..100000]of boolean;

procedure spfa(s:longint);

var i,j,k,p,q:longint;

begin

fillchar(dist,sizeof(dist),0);

fillchar(d,sizeof(d),0);

fillchar(b,sizeof(b),false);

dist[s]:=1;d[1]:=s;b[s]:=true;

p:=1;q:=1;

repeat

i:=head[d[p]];

while i<>0 do

begin

if (dist[e[i]]=0)and(dist[d[p]]=1) then

begin

dist[e[i]]:=1;

if not b[e[i]] then

begin

inc(q);

d[q]:=e[i];

end;

end;

i:=next[i];

end;

b[d[p]]:=false;

inc(p);

until p>q;

end;

begin

readln(n,m);

for i:=1 to n do read(a[i]);

for i:=1 to m do

begin

readln(x,y,z);

inc(j);

e[j]:=y;e1[j]:=x;

next[j]:=head[x];next1[j]:=head1[y];

head[x]:=j;head1[y]:=j;

if z=2 then

begin

inc(j);

e[j]:=x;e1[j]:=y;

next[j]:=head[y];next1[j]:=head1[x];

head[y]:=j;head1[x]:=j;

end;

end;

m:=j;

spfa(1);

f1:=dist;f1[1]:=0;f1[n]:=0;

e:=e1;next:=next1;head:=head1;

spfa(n);

f2:=dist;f2[1]:=0;f2[n]:=0;

max:=0;min:=1000;

for i:=1 to n do

begin

if (f1[i]=1)and(f2[i]=1) then

begin

if a[i]>max then max:=a[i];

if a[i]<min then min:=a[i];

end;

end;

if (max=min)or(max=0)or(min=1000) then write(0)

else write(max-min);

end.

同样是ac,并且在pascal中不再出现栈溢出,在校方评测机上也ac,主要不同只是在于

{{{

第一条程序

procedure spfa(s:longint);

var i,j,k,p,q:longint;

d:array[0..500000]of longint;

b:array[0..100000]of boolean;{b和d两个数组在过程中定义}

第二条程序

program trade;

var i,j,k,m,n,x,y,z,l,max,min:longint;

a,f1,f2,dist,head,head1:array[0..100000]of longint;

e,e1,next,next1:array[0..500000]of longint;

d:array[0..500000]of longint;

b:array[0..100000]of boolean;

{b和d两个数组放在主程序中定义}

}}}

这到底是为什么呢?求各位高手前辈指点

我只有200+积分,悬赏就这么多了,请见谅

#1 chenghao@2013-08-22 21:33:00
回复 删除
是否有下标越界的情况?
#2 107229HR@2013-08-22 22:39:00
回复 删除
C_Plus_Plus党路过

推荐别悬赏200,悬赏20,不然没人看。。。

#3 604491113@2013-08-23 00:10:00
回复 删除
回复 沙发chenghao 的帖子

没有

#4 604491113@2013-08-23 00:11:00
回复 删除
回复 板凳107229HR 的帖子

谢谢提醒

#5 wuzw@2013-08-23 01:03:00
回复 删除
我只知道,rqnoj中有时不提示内存超界
#6 107229HR@2013-08-23 04:12:00
回复 删除
看完程序大概理解了点

我是C++的,对Pascal不是很了解,以下仅仅是我的观念,因为我类似用C++解释Pascal

(此处省略减号20个)我是分割线(此处省略减号11个)

你玩过递归么?为何递归到100000层就挂了?

原因是系统爆栈了。。

这也就意味着——系统的栈空间被你用完了然后没空间了

而你这个500000的数组也是占用栈空间的,因为它被定义在其内部。

(此处省略减号20个)我是分割线(此处省略减号11个)

重申一遍,我是C++的,对Pascal不是很了解,以上仅仅是我的观念,因为我类似用C++解释Pascal

#7 初夏、樱花落@2013-08-23 05:26:00
回复 删除
回复楼主

[color=yellow]呃。好长的程序啊!看不懂诶~

#8 1271237003@2013-10-11 02:48:00
回复 删除
正解如下

如果数组开得很大放到过程中,由于递归你会一层一层的进去,此时你每进一层就会重开数组,如上面那位107229HR所说,当你数组不断的开启那当然就会发生爆栈了

#9 604491113@2013-10-11 02:50:00
回复 删除
谢谢两位

已经明白了,谢谢两位

查看更多回复
提交回复