之前看听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.
poj3169

 

posted on 2014-05-06 18:17  acphile  阅读(152)  评论(0编辑  收藏  举报