zoukankan      html  css  js  c++  java
  • 差分约束系统小探(未完)

    之前看听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
  • 相关阅读:
    VC++基于ICMP 遍历路由表
    在XP上同时运行IE6,IE7,IE8,IE9
    VC++实现ARP协议
    在Windows Sever 2008 Windows7上同时运行绿色IE10测试HTML5
    VC++实践IOCP编程
    VC++实现检测网络状态所有的TCP与UDP通信
    VC++实现UDP数据包发送
    VC++实现改变网关
    面试十大难题的样板回答
    WinAPI: GetLocalTime、SetLocalTime、SetSystemTime 获取与设置系统时间
  • 原文地址:https://www.cnblogs.com/phile/p/4473242.html
Copyright © 2011-2022 走看看