最小不相交路径覆盖了解一下:每一条路径经过的顶点各不相同。最小路径覆盖=原图的结点数-新图的最大匹配数。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;
int m,line[505][505],girl[505],used[505],t,st[505],ed[505],sx[505],sy[505],ex[505],ey[505];
bool find(int x)
{
for (int j=1; j<=m; j++)
{
if (line[x][j] && !used[j])
{
used[j]=1;
if (girl[j]==-1 || find(girl[j]))
{
girl[j]=x;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d",&m);
memset(line,0,sizeof(line));
for (int i=1; i<=m; i++)
{
int h,m;
scanf("%d:%d%d%d%d%d",&h,&m,&sx[i],&sy[i],&ex[i],&ey[i]);
st[i]=h*60+m;
ed[i]=st[i]+abs(sx[i]-ex[i])+abs(sy[i]-ey[i]);
}
for (int i=1; i<=m; i++)
{
for (int j=i+1; j<=m; j++)
{
if (ed[i]+abs(sx[j]-ex[i])+abs(sy[j]-ey[i])+1<=st[j])
{
line[i][j]=1;
}
}
}
memset(girl,-1,sizeof(girl));
int all=0;
for (int i=1; i<=m; i++)
{
memset(used,0,sizeof(used));
if (find(i)) all++;
}
cout<<m-all<<endl;
}
return 0;
}