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;
}

 

posted @ 2012-08-12 23:19  'wind  阅读(188)  评论(0编辑  收藏  举报