有点类似于SPFA,设min[i]是从第一个点到第i个点所购入的最小值,再将所有边反向(这样保证先买后卖),max[i]是从第n个点到第i个点所购入的最大值,最后max[i]-min[i]的最大值即是答案
program trade;
var
flag:array[1..100000] of boolean;
a,b:array[1..100000,0..200] of longint;
v,q,maxv,minv:array[1..100000] of longint;
n,m:longint;
procedure init;
var
i,j,x,y,z:longint;
begin
readln(n,m);
for i:=1 to n do
begin
read(v[i]);
maxv[i]:=-maxint;
minv[i]:=maxint;
end;
readln;
for i:=1 to m do
begin
readln(x,y,z);
inc(a[x,0]);
a[x,a[x,0]]:=y;
inc(b[y,0]);
b[y,b[y,0]]:=x;
if z=2 then
begin
inc(a[y,0]);
a[y,a[y,0]]:=x;
inc(b[x,0]);
b[x,b[x,0]]:=y;
end;
end;
end;
function max(x,y:longint):longint;
begin
if x>y then max:=x
else max:=y;
end;
function min(x,y:longint):longint;
begin
if x<y then min:=x
else min:=y;
end;
procedure bfs1;
var
i,l,r:longint;
begin
fillchar(q,sizeof(q),0);
fillchar(flag,sizeof(flag),false);
minv[1]:=v[1];
flag[1]:=true;
l:=0;
r:=1;
q[1]:=1;
while l<>r do
begin
flag[q[l]]:=false;
l:=(l mod n)+1;
for i:=1 to a[q[l],0] do
if (minv[q[l]]<minv[a[q[l],i]]) and not flag[a[q[l],i]] then
begin
r:=(r mod n)+1;
q[r]:=a[q[l],i];
flag[a[q[l],i]]:=true;
if minv[a[q[l],i]]=maxint then minv[a[q[l],i]]:=min(minv[q[l]],v[a[q[l],i]])
else minv[a[q[l],i]]:=minv[q[l]];
end;
end;
end;
procedure bfs2;
var
l,r,i:longint;
begin
fillchar(q,sizeof(q),0);
fillchar(flag,sizeof(flag),false);
q[1]:=n;
flag[n]:=true;
maxv[n]:=v[n];
l:=0;
r:=1;
while l<>r do
begin
flag[q[l]]:=false;
l:=(l mod n)+1;
for i:=1 to b[q[l],0] do
if (maxv[q[l]]>maxv[b[q[l],i]]) and not flag[b[q[l],i]] then
begin
r:=(r mod n)+1;
q[r]:=b[q[l],i];
flag[q[r]]:=true;
if maxv[b[q[l],i]]=-maxint then maxv[b[q[l],i]]:=max(maxv[q[l]],v[b[q[l],i]])
else maxv[b[q[l],i]]:=maxv[q[l]];
end;
end;
end;
procedure print;
var
i,ans:longint;
begin
ans:=0;
for i:=1 to n do
if maxv[i]-minv[i]>ans then ans:=maxv[i]-minv[i];
writeln(ans);
end;
begin
assign(input,'trade.in');
reset(input);
assign(output,'trade.out');
rewrite(output);
init;
bfs1;
bfs2;
print;
close(input);
close(output);
end.