您的位置:首页 > 其它

POJ 2060 Taxi Cab Scheme【最小路径覆盖】

2012-08-12 23:19 417 查看
题意: 知道了一些出租车任务的时间,每个任务需要一辆出租车从该任务的起点到终点,有些任务有时间上的冲突,问最少需要多少
辆出租车能完成任务。
分析: 最小路径覆盖。
    如果两个任务没有冲突,就在两个任务之间连一条边,找出最少的路径条数来覆盖所有点,(一条路径只需要一辆车)。
最小路径覆盖 = 总权 - 最大匹配

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: