标签:style blog ar color sp div log 代码 bs
题意:
出租车公司有M个订单。
订单格式: hh:mm a b c d 含义:在hh:mm这个时刻客人将从(a,b)这个位置出发,他(她)要去(c,d)这个位置。
规定1:从(a,b)到(c,d)所花的时间为:abs(a-c)+abs(b-d)。
规定2:一辆出租车如果要接单,必须在客人出发前1分钟(包括)以前接单。
问,最少派出多少辆出租车,可以完成所有任务。
思路:
把每一笔单看成一个点,如果完成第i个单后可以接到第j个单,则 i->j连上线。
则题为:求这个DAG图的最小路径覆盖。
代码: *:记得要初始化!
struct node{ int a,b,c,d,beginTime; }ride[505]; int T,n; char s[55]; vector<int> graph[505]; int cx[505],cy[505]; bool bmask[505]; int findPath(int u){ int L=graph[u].size(); rep(i,0,L-1){ int v=graph[u][i]; if(!bmask[v]){ bmask[v]=true; if(cy[v]==-1||findPath(cy[v])){ cy[v]=u; cx[u]=v; return 1; } } } return 0; } int MaxMatch(){ int ans=0; rep(i,1,n) cx[i]=cy[i]=-1; rep(i,1,n) if(cx[i]==-1){ mem(bmask,false); ans+=findPath(i); } return ans; } int ABS(int x,int y){ return abs(x-y); } int main(){ cin>>T; while(T--){ scanf("%d",&n); rep(i,1,n) graph[i].clear(); rep(i,1,n){ int hour,minute; scanf("%d:%d",&hour,&minute); scanf("%d%d%d%d",&ride[i].a,&ride[i].b,&ride[i].c,&ride[i].d); ride[i].beginTime=60*hour+minute; } rep(i,1,n) rep(j,i+1,n){ if(ride[i].beginTime+ABS(ride[i].a,ride[i].c)+ABS(ride[i].b,ride[i].d)+ ABS(ride[i].c,ride[j].a)+ABS(ride[i].d,ride[j].b)+1<=ride[j].beginTime) graph[i].push_back(j); } int dd=MaxMatch(); printf("%d\n",n-dd); } }
poj 2060 Taxi Cab Scheme(DAG图的最小路径覆盖)
标签:style blog ar color sp div log 代码 bs
原文地址:http://www.cnblogs.com/fish7/p/4106998.html