之前看听zyh讲了一下差分,没大懂;
后来稍微研究了一下,大概懂了一些;
这应该是线性规划的一种,大概是
给定一堆形如xj-xi<=wij的约束条件,要求我们满足条件的最优值(最大或最小)
整理一下这个式子,得到xi+wij>=xj 发现这个东西很像spfa中的三角不等式(松弛操作)
于是我们可以构造约束图,把xi看做点i
于是对于每一个xi+wij>=xj ,我们就连边i-->j边权为wij
然后做最短路即可
其实我还是不怎么懂,还需要在研究一下,待续
1 const inf=200000007; 2 type link=^node; 3 node=record 4 po,len:longint; 5 next:link; 6 end; 7 8 var w:array[0..1010] of link; 9 count,d:array[0..1010] of longint; 10 v:array[0..1010] of boolean; 11 q:array[0..2000010] of longint; 12 x,y,z,k1,k2,n,i:longint; 13 14 procedure add(x,y,z:longint); 15 var p:link; 16 begin 17 new(p); 18 p^.po:=y; 19 p^.len:=z; 20 p^.next:=w[x]; 21 w[x]:=p; 22 end; 23 24 function spfa:longint; 25 var x,i,y,f,r:longint; 26 p:link; 27 begin 28 for i:=2 to n do 29 d[i]:=inf; 30 d[1]:=0; 31 v[1]:=true; 32 f:=1; 33 r:=1; 34 q[1]:=1; 35 while f<=r do 36 begin 37 x:=q[f]; 38 v[x]:=false; 39 p:=w[x]; 40 while p<>nil do 41 begin 42 y:=p^.po; 43 if d[y]>d[x]+p^.len then 44 begin 45 d[y]:=d[x]+p^.len; 46 if not v[y] then 47 begin 48 inc(r); 49 q[r]:=y; 50 v[y]:=true; 51 inc(count[y]); 52 if count[y]>n then exit(-1); 53 end; 54 end; 55 p:=p^.next; 56 end; 57 inc(f); 58 end; 59 if d[n]=inf then exit(-2); 60 exit(d[n]); 61 end; 62 63 begin 64 readln(n,k1,k2); 65 for i:=1 to k1 do 66 begin 67 readln(x,y,z); 68 add(x,y,z); 69 end; 70 for i:=1 to k2 do 71 begin 72 readln(x,y,z); 73 add(y,x,-z); 74 end; 75 writeln(spfa); 76 end.