码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj3996

时间:2015-05-09 18:44:20      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:

把这个式子弄清楚就知道这是最小割了

相当于,选某个点i有收入ai,i,会损失ci,

如果i,j都被选则有额外收入ai,j+aj,i

明显,对每个点i,连(s,i,∑ai,j) (i,t,ci)

对每对i,j连边(i,j,ai,j),没了

技术分享
  1 const inf=100000007;
  2 type node=record
  3        po,next,flow:longint;
  4      end;
  5 
  6 var e:array[0..2000010] of node;
  7     p,numh,h,cur,pre,d:array[0..510] of longint;
  8     t,len,ans,i,j,n,m,x,s:longint;
  9 
 10 procedure add(x,y,f:longint);
 11   begin
 12     inc(len);
 13     e[len].po:=y;
 14     e[len].flow:=f;
 15     e[len].next:=p[x];
 16     p[x]:=len;
 17   end;
 18 
 19 procedure build(x,y,f:longint);
 20   begin
 21     add(x,y,f);
 22     add(y,x,0);
 23   end;
 24 
 25 function min(a,b:longint):longint;
 26   begin
 27     if a>b then exit(b) else exit(a);
 28   end;
 29 
 30 function sap:longint;
 31   var u,i,j,tmp,neck,q:longint;
 32   begin
 33     numh[0]:=t+1;
 34     for i:=0 to t do
 35       cur[i]:=p[i];
 36     u:=0; sap:=0; neck:=inf;
 37     while h[0]<t+1 do
 38     begin
 39       d[u]:=neck;
 40       i:=cur[u];
 41       while i<>-1 do
 42       begin
 43         j:=e[i].po;
 44         if (e[i].flow>0) and (h[u]=h[j]+1) then
 45         begin
 46           neck:=min(neck,e[i].flow);
 47           pre[j]:=u;
 48           cur[u]:=i;
 49           u:=j;
 50           if u=t then
 51           begin
 52             sap:=sap+neck;
 53             while u<>0 do
 54             begin
 55               u:=pre[u];
 56               j:=cur[u];
 57               dec(e[j].flow,neck);
 58               inc(e[j xor 1].flow,neck);
 59             end;
 60             neck:=inf;
 61           end;
 62           break;
 63         end;
 64         i:=e[i].next;
 65       end;
 66       if i=-1 then
 67       begin
 68         dec(numh[h[u]]);
 69         if numh[h[u]]=0 then break;
 70         q:=-1;
 71         tmp:=t;
 72         i:=p[u];
 73         while i<>-1 do
 74         begin
 75           j:=e[i].po;
 76           if e[i].flow>0 then
 77             if tmp>h[j] then
 78             begin
 79               q:=i;
 80               tmp:=h[j];
 81             end;
 82           i:=e[i].next;
 83         end;
 84         h[u]:=tmp+1;
 85         inc(numh[h[u]]);
 86         cur[u]:=q;
 87         if u<>0 then
 88         begin
 89           u:=pre[u];
 90           neck:=d[u];
 91         end;
 92       end;
 93     end;
 94   end;
 95 
 96 begin
 97   len:=-1;
 98   fillchar(p,sizeof(p),255);
 99   readln(n);
100   t:=n+1;
101   for i:=1 to n do
102   begin
103     s:=0;
104     for j:=1 to n do
105     begin
106       read(x);
107       s:=s+x;
108       build(i,j,x);
109     end;
110     build(0,i,s);
111     ans:=ans+s;
112   end;
113   for i:=1 to n do
114   begin
115     read(x);
116     build(i,t,x);
117   end;
118   writeln(ans-sap);
119 end.
View Code

 

bzoj3996

标签:

原文地址:http://www.cnblogs.com/phile/p/4490746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!