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 |
pascal zkw费用流532ms..打搓了。。//Problem:poj 3680; //Author:zzx; //Language:Pascal; //Meno:MaxFlowMinCost; const inf=3208328; type edge=record x,f,c,next,op:longint; end; list=record x,y,z:longint; end; var point:array [0..2001] of list; b:array [0..20000] of edge; a,dis,pre,id,cur:array [0..2001] of longint; v:array [0..2001] of boolean; q:array [0..800000] of longint; hash:array [0..2001] of longint; cases,casesth,limit,n,tot,sum,m,s,t,ans,cost:longint; procedure init; var i:longint; begin readln; readln(n,limit); sum:=0; m:=n; for i:=1 to n do begin readln(point[i].x,point[i].y,point[i].z); inc(sum); hash[sum]:=point[i].x; inc(sum); hash[sum]:=point[i].y; end; end; procedure qsort(x,y:longint); var p,q,mid:longint; begin p:=x; q:=y; mid:=hash[(x+y) div 2]; repeat while hash[x]<mid do inc(x); while hash[y]>mid do dec(y); if x<=y then begin hash[0]:=hash[x]; hash[x]:=hash[y]; hash[y]:=hash[0]; inc(x); dec(y); end; until x>y; if p<y then qsort(p,y); if x<q then qsort(x,q); end; procedure cut_repeat; var i:longint; begin sum:=0; for i:=1 to 2*n do if (sum=0) or (hash[i]<>hash[sum]) then begin inc(sum); hash[sum]:=hash[i]; end; end; function find(x:longint):longint; var i:longint; begin for i:=1 to sum do if hash[i]=x then exit(i); end; procedure addedge(x,y,c,f,t:longint); begin inc(tot); b[tot].x:=y; b[tot].c:=c; b[tot].f:=f; b[tot].op:=tot+t; b[tot].next:=a[x]; a[x]:=tot; end; procedure buildedge; var i:longint; begin tot:=0; fillchar(a,sizeof(a),0); n:=sum; for i:=0 to n do begin addedge(i,i+1,limit,0,1); addedge(i+1,i,0,0,-1); end; for i:=1 to m do begin addedge(find(point[i].x),find(point[i].y),1,-point[i].z,1); addedge(find(point[i].y),find(point[i].x),0,point[i].z,-1); end; inc(n); s:=0; t:=n; end; function min(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; function dfs(x,flow:longint):longint; var now,p,pp,delta:longint; begin if x=t then begin ans:=ans+flow*cost; exit(flow); end; p:=cur[x]; p:=a[x]; v[x]:=false; now:=flow; while p<>0 do begin pp:=b[p].x; if v[pp]=false then begin p:=b[p].next; continue; end; if (b[p].c=0) or (b[p].f<>0) then begin p:=b[p].next; continue; end; delta:=dfs(pp,min(flow,b[p].c)); b[p].c:=b[p].c-delta; b[b[p].op].c:=b[b[p].op].c+delta; now:=now-delta; if now=0 then exit(flow); p:=b[p].next; end; exit(flow-now); end; function augment:boolean; var head,tail,k,p,pp,tt,i:longint; begin fillchar(dis,sizeof(dis),$7f); head:=1; tail:=1; q[1]:=t; dis[t]:=0; repeat k:=q[head]; p:=a[k]; inc(head); if head>800000 then head:=1; while p<>0 do begin pp:=b[p].x; tt:=dis[k]-b[p].f; if (b[b[p].op].c>0) and (tt<dis[pp]) then begin dis[pp]:=tt; if (head=tail+1) then begin inc(tail); if tail>800000 then tail:=1; q[tail]:=pp; end else if dis[pp]<=dis[q[head]] then begin dec(head); if head=0 then head:=800000; q[head]:=pp; end else if dis[pp]>dis[q[head]] then begin inc(tail); if tail>800000 then tail:=1; q[tail]:=pp; end; end; p:=b[p].next; end; until head=tail+1; for k:=s to t do begin p:=a[k]; while p<>0 do begin b[p].f:=b[p].f+dis[b[p].x]-dis[k]; p:=b[p].next; end; end; cost:=cost+dis[s]; exit(dis[s]<inf); end; procedure main; begin ans:=0; cost:=0; while augment do repeat fillchar(v,sizeof(v),true); until dfs(s,maxlongint)=0; writeln(-ans); end; begin readln(cases); for casesth:=1 to cases do begin init; qsort(1,sum); cut_repeat; buildedge; main; end; end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator