POJ 2060 Taxi Cab Scheme【最小路径覆盖】
题意: 知道了一些出租车任务的时间,每个任务需要一辆出租车从该任务的起点到终点,有些任务有时间上的冲突,问最少需要多少
辆出租车能完成任务。
分析: 最小路径覆盖。
如果两个任务没有冲突,就在两个任务之间连一条边,找出最少的路径条数来覆盖所有点,(一条路径只需要一辆车)。
最小路径覆盖 = 总权 - 最大匹配
#include<stdio.h> #include<string.h> struct node { int to,next; }e[1000000]; int tot; int head[505]; void add(int s,int u) { e[tot].to=u; e[tot].next=head[s]; head[s]=tot++; } int v[505]; int link[505]; int find(int x) { int i,k; for(i=head[x];i;i=e[i].next) { k=e[i].to; if(!v[k]) { v[k]=1; if(link[k]==0||find(link[k])) { link[k]=x; return 1; } } } return 0; } struct p { int x,y; int x1,y1; int st,en; }q[100000]; int ab(int x) { return x>0?x:-x; } int main() { int t,i,j,n,h,m,dis,res; scanf("%d",&t); while(t--) { scanf("%d",&n); tot=1; memset(link,0,sizeof(link)); memset(head,0,sizeof(head)); for(i=1;i<=n;i++) { scanf("%d:%d",&h,&m); scanf("%d%d%d%d",&q[i].x,&q[i].y,&q[i].x1,&q[i].y1); q[i].st=h*60+m; q[i].en=q[i].st+ab(q[i].x1-q[i].x)+ab(q[i].y1-q[i].y); } for(i=1;i<=n;i++) for(j=1;j<=n;j++) { dis=ab(q[i].x1-q[j].x)+ab(q[i].y1-q[j].y); if(q[i].en+dis<q[j].st) add(i,j); } res=0; for(i=1;i<=n;i++) { memset(v,0,sizeof(v)); if(find(i)) res++; } printf("%d\n",n-res); } return 0; }