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