{此程序参考的是 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+积分,悬赏就这么多了,请见谅
我是C++的,对Pascal不是很了解,以下仅仅是我的观念,因为我类似用C++解释Pascal
(此处省略减号20个)我是分割线(此处省略减号11个)
你玩过递归么?为何递归到100000层就挂了?
原因是系统爆栈了。。
这也就意味着——系统的栈空间被你用完了然后没空间了
而你这个500000的数组也是占用栈空间的,因为它被定义在其内部。
(此处省略减号20个)我是分割线(此处省略减号11个)
重申一遍,我是C++的,对Pascal不是很了解,以上仅仅是我的观念,因为我类似用C++解释Pascal
如果数组开得很大放到过程中,由于递归你会一层一层的进去,此时你每进一层就会重开数组,如上面那位107229HR所说,当你数组不断的开启那当然就会发生爆栈了