最小路径覆盖数=顶点数—最大匹配数。
#include<string.h>
#include<cstdio>
#include<vector>
#include<cmath>
#include<iostream>
using namespace std;
struct P
{
int ti;
int a,b,c,d;
};
P A[505];
bool used[505],map[505][505];
int Link[505],n;
int dfs(int x)
{
int i,j;
for(i=0;i<n;i++)
if(map[x][i]&&!used[i])
{
used[i]=1;
if(Link[i]==-1||dfs(Link[i]))
{
Link[i]=x;
return 1;
}
}
return 0;
}
int fun()
{
int i,num=0;
memset(Link,-1,sizeof(Link));
for(i=0;i<n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i))
num++;
}
return n-num;
}
bool pd(int x,int y)
{
int temp;
if(x==y)
return 0;
temp=abs(A[x].a-A[x].c)+abs(A[x].b-A[x].d)+A[x].ti;
temp+=abs(A[x].c-A[y].a)+abs(A[x].d-A[y].b);
if(temp<A[y].ti)
return 1;
return 0;
}
int main()
{
int h,m,N;
cin>>N;
while(N--)
{
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d:%d",&h,&m);
A[i].ti=h*60+m;
cin>>A[i].a>>A[i].b>>A[i].c>>A[i].d;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
map[i][j]=pd(i,j);
}
cout<<fun()<<endl;
}
return 0;
}