poj3216 Repairing Company
2013-06-13 14:22
429 查看
这道题依然是最小路径覆盖裸题,以每个任务为节点建立二分图,之后再求最大匹配数,然后再用总任务数减去最大匹配数即可。
var q,m:longint; a:array[1..200,1..3]of longint; dis:array[1..20,1..20]of longint; g:array[1..200,1..200]of longint; t,match:array[1..200]of longint; h:array[1..200]of boolean; procedure init; var i,j,k:longint; begin fillchar(dis,sizeof(dis),0); fillchar(t,sizeof(t),0); fillchar(match,sizeof(match),0); for i:=1 to q do for j:=1 to q do begin read(dis[i,j]); if(dis[i,j]=-1)then dis[i,j]:=maxlongint>>2; end; for i:=1 to q do dis[i,i]:=0; for k:=1 to q do for i:=1 to q do for j:=1 to q do if(dis[i,k]+dis[k,j]<dis[i,j])then dis[i,j]:=dis[i,k]+dis[k,j]; for i:=1 to m do begin readln(a[i][1],a[i][2],a[i][3]); a[i][3]:=a[i][2]+a[i][3]; end; for i:=1to m do for j:=1 to m do if(i<>j)then begin if(a[i][3]+dis[a[i][1],a[j][1]]<=a[j][2])then begin inc(t[i]);g[i,t[i]]:=j; end; end; end; function check(k:longint):boolean; var i:longint; begin for i:=1 to t[k] do if(not h[g[k,i]])then begin h[g[k,i]]:=true; if(match[g[k,i]]=0)or(check(match[g[k,i]]))then begin match[g[k,i]]:=k; exit(true); end; end; exit(false); end; function hungarian:longint; var i,ans:longint; begin ans:=0; for i:=1 to m do begin fillchar(h,sizeof(h),0); if(check(i))then inc(ans); end; exit(ans); end; begin readln(q,m); while(q<>0)do begin init; writeln(m-hungarian); readln(q,m); end; end.
相关文章推荐
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- 状态压缩DP poj 2817 WordStack 入门题
- POJ1003解题方案
- POJ2418解题方案
- POJ 1003 java
- poj水题
- poj 1417 True Liars 解题报告 并查集 DP
- poj2243Knight Moves(Floyed-Warshall)
- poj3468(线段树成段更新)
- poj3264(RMQ问题的线段树实现方法)
- poj2777Count color(线段树)
- poj2823(线段树)
- poj1679(The Unique MST)Kruskal
- poj2352Stars(树状数组)
- poj1195(二维树状数组)
- poj2236(Wireless Network)
- poj1470(Closest Common Ancestors)
- poj2536二分图匹配
- poj1274 The Perfect Stall