poj2060 Taxi Cab Scheme - 最小路径覆盖

  有m个订单,然后每个订单都有出发时间,起点,终点,然后问你完成这m个订单至少需要多少个出租车,可以这样想,m个订单,最多是m辆出租车,然后假如有一辆出租车第一个订单完成后,到达第二个订单的起点位置的时间<=第二个订单的出发时间-1,那么需要的出租车的数量就-1.由此可以知道需要的最少出租车数量就是m-最大匹配数。然后建图的时候注意一下就行了

  最小路径覆盖=顶点数-最大匹配

  很奇怪加了 std::ios::sync_with_stdio(false); 这句就过不了

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std;
int line[505][505],used[505],nxt[505];
int m;
struct node
{
    int ne;
    int sx,sy,ex,ey;
    int t;
}ta[505];
bool cmp(const struct node&a,const struct node&b)
{
    return a.t<b.t;

}
int icount(int x1,int y1,int x2,int y2)
{
    return abs(x1-x2)+abs(y1-y2);
}
bool ifind(int x)
{
    for(int i=1;i<=m;i++)
    {
        if(line[x][i]&&!used[i])
        {
            used[i]=1;
            if(nxt[i]==0||ifind(nxt[i]))
            {
                nxt[i]=x;
                return true;
            }
        }
    }
    return false;
}
int match()
{
    int ans=0;
    for(int i=1;i<=m;i++)
    {
        memset(used,0,sizeof(used));
        if(ifind(i))
            ans++;
    }
    return ans;
}
int main()
{
    
    int t;
    cin>>t;
    //cout<<"输入的t为:"<<t<<endl;
    while(t--)
    {

        memset(line,0,sizeof(line));
        memset(nxt,0,sizeof(nxt));
        cin>>m;
        for(int i=1;i<=m;i++)
        {
            int a,b,c,d,e,f;
            scanf("%d:%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
            ta[i].ne=abs(c-e)+abs(d-f);
            ta[i].sx=c;
            ta[i].sy=d;
            ta[i].ex=e;
            ta[i].ey=f;
            ta[i].t=a*60+b;
        }
        sort(ta+1,ta+m+1,cmp);
        /*
        cout<<"输入的任务为"<<endl;
        for(int i=1;i<=m;i++)
            cout<<ta[i].ne<<" "<<ta[i].sx<<" "<<ta[i].sy<<" "<<ta[i].ex<<" "<<ta[i].ey<<" "<<ta[i].t<<endl;
        cout<<"************8"<<endl;
        */
        for(int i=1;i<=m;i++)
            for(int j=i+1;j<=m;j++)
            {
                if((ta[i].t+ta[i].ne+icount(ta[i].ex,ta[i].ey,ta[j].sx,ta[j].sy))<=(ta[j].t-1))
                    line[i][j]=1;

            }
        cout<<m-match()<<endl;


    }
    return 0;

}

 

posted @ 2018-07-28 21:44  eason99  阅读(59)  评论(0编辑  收藏  举报