bzoj1934
1 var 2 ans,u,v,x,tot,kk,i,j,k,l,n,m,ee,s,t:longint; 3 d,last,next,long,other,e,head,num:array[0..200000]of longint; 4 5 function min(aa,bb:longint):longint; 6 begin 7 if aa>bb then exit(bb) 8 else exit(aa); 9 end; 10 11 procedure add(u,v,c:longint); 12 begin 13 inc(kk); 14 other[kk]:=kk+1; 15 e[kk]:=v; 16 next[kk]:=head[u]; 17 head[u]:=kk; 18 long[kk]:=c; 19 inc(kk); 20 e[kk]:=u; 21 next[kk]:=head[v]; 22 head[v]:=kk; 23 long[kk]:=0; 24 other[kk]:=kk-1; 25 end; 26 27 function dfs(x,flow:longint):longint; 28 var j,p:longint; 29 begin 30 if x=t then exit(flow); 31 dfs:=0; j:=last[x]; 32 while j<>0 do 33 begin 34 if (long[j]>0)and(d[x]=d[e[j]]+1) then 35 begin 36 last[x]:=j; 37 p:=dfs(e[j],min(flow-dfs,long[j])); 38 dec(long[j],p); inc(long[other[j]],p); 39 dfs:=dfs+p; 40 if dfs=flow then exit; 41 end; 42 j:=next[j]; 43 end; 44 if d[s]>tot then exit; 45 dec(num[d[x]]); 46 if num[d[x]]=0 then d[s]:=tot; 47 inc(d[x]); 48 last[x]:=head[x]; 49 inc(num[d[x]]); 50 end; 51 52 begin 53 readln(n,m); 54 s:=0;t:=n+1; 55 for i:=1 to n do 56 begin 57 read(x); 58 if x=1 then 59 add(s,i,1) 60 else 61 add(i,t,1); 62 end; 63 for i:=1 to m do 64 begin 65 readln(u,v); 66 add(u,v,1); 67 add(v,u,1); 68 end; 69 tot:=t+1; 70 num[0]:=tot; 71 for i:=s to t do 72 last[i]:=head[i]; 73 while d[s]<=tot do 74 ans:=ans+dfs(s,maxlongint); 75 writeln(ans); 76 end.
-------------------------------------------------------------------------
花有重开日,人无再少年