Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
求助!为什么WA啊?USACO的数据都过了!Program Poj_2112;//by whitetooth; Const maxn=250;maxm=15000; filename='milking'; Var pre,other,flow :array[0..maxm] of longint; last,can,dist,sum,father :array[0..maxn] of longint; a :array[0..maxn,0..maxn] of longint; n,m,c,i,s,t,ans :longint; Procedure Init; Var j :longint; Begin read(n,m,c); s:=0;t:=n+m+1; fillchar(a,sizeof(a),100); for i:=1 to n+m do for j:=1 to n+m do begin read(a[i,j]); if (a[i,j]=0)and(i<>j) then a[i,j]:=maxlongint shr 1; end; End; Procedure Prepare; Var j,k :longint; Begin for k:=1 to n+m do for i:=1 to n+m do for j:=1 to n+m do if a[i,j]>a[i,k]+a[k,j] then a[i,j]:=a[i,k]+a[k,j]; End; Procedure In_Path(Var l:longint;p,q,r:longint); Begin inc(l);pre[l]:=last[p];last[p]:=l;other[l]:=q;flow[l]:=r; inc(l);pre[l]:=last[q];last[q]:=l;other[l]:=p;flow[l]:=0; End; Function Max_flow:longint; Var p,q,inflow,k,min :longint; flag :boolean; Begin max_flow:=0; for i:=s to t do can[i]:=last[i]; sum[0]:=t+1; i:=s; inflow:=maxlongint; while dist[s]<t+1 do begin flag:=false; p:=can[i]; while p<>-1 do begin q:=other[p]; if (flow[p]>0)and(dist[i]=dist[q]+1) then begin flag:=true; if flow[p]<inflow then inflow:=flow[p]; can[i]:=p; father[q]:=p; i:=q; if i=t then begin inc(max_flow,inflow); while i<>s do begin p:=father[i]; dec(flow[p],inflow); inc(flow[p xor 1],inflow); i:=other[p xor 1]; end; inflow:=maxlongint; end; break; end; p:=pre[p]; end; if flag then continue; min:=t+1; p:=last[i]; while p<>-1 do begin q:=other[p]; if (flow[p]>0)and(dist[q]<min) then begin min:=dist[q]; k:=p; end; p:=pre[p]; end; can[i]:=k; dec(sum[dist[i]]); if sum[dist[i]]=0 then break; dist[i]:=min+1; inc(sum[dist[i]]); if i<>s then i:=other[father[i] xor 1]; end; End; Function Check(x:longint):boolean; Var i,j,l,temp :longint; Begin fillchar(last,sizeof(last),255); fillchar(dist,sizeof(dist),0); fillchar(sum,sizeof(sum),0); l:=-1; for i:=1 to n do for j:=n+1 to n+m do if a[i,j]<=x then in_path(l,i,j,1); for i:=1 to n do in_path(l,s,i,c); for i:=n+1 to n+m do in_path(l,i,t,1); temp:=max_flow; if temp=m then exit(true) else exit(false); End; Procedure Main; Var j,l,r,mid,max :longint; Begin prepare; max:=0; for i:=1 to n do for j:=n+1 to n+m do if a[i,j]>max then max:=a[i,j]; l:=0;r:=max; while l<=r do begin mid:=(l+r) shr 1; if check(mid) then begin ans:=mid; r:=mid-1; end else l:=mid+1; end; End; Procedure Print; Begin writeln(ans); End; Begin Init; Main; Print; End. USACO的数据全都过了,交到这里就是WA…… Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator