题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1350
题解:起始时间+到目的地时间+目的地到下一个起始地时间<出发时间,建立一条边,求最小路径覆盖
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXN 500
int mp[MAXN][MAXN],from[MAXN],used[MAXN],m;
struct node
{
int x1,y1,x2,y2;
int st,time;
}taxis[MAXN];
int match(int x)//匈牙利算法
{
int i;
for(i=0;i<m;++i)
{
if(!used[i]&&mp[x][i])
{
used[i]=1;
if(from[i]==-1||match(from[i]))
{
from[i]=x;
return 1;
}
}
}
return 0;
}
int Cal_time(int x1,int y1,int x2,int y2)
{
return abs(x1-x2)+abs(y1-y2);
}
int main()
{
int test,i,j,sum,hh,mm,temp;
scanf("%d",&test);
while(test--)
{
scanf("%d",&m);
for(i=0;i<m;++i)
{
scanf("%d:%d",&hh,&mm);
scanf("%d %d %d %d",&taxis[i].x1,&taxis[i].y1,&taxis[i].x2,&taxis[i].y2);
taxis[i].st=hh*60+mm;
taxis[i].time=Cal_time(taxis[i].x1,taxis[i].y1,taxis[i].x2,taxis[i].y2);
}
memset(mp,0,sizeof(mp));
for(i=0;i<m-1;++i)
{
for(j=i+1;j<m;++j)
{//起始时间+到目的地时间+目的地到下一个起始地时间<出发时间,建立一条边
temp=Cal_time(taxis[i].x2,taxis[i].y2,taxis[j].x1,taxis[j].y1);
if((taxis[i].st+taxis[i].time+temp)<taxis[j].st)
mp[i][j]=1;
}
}
sum=0;
memset(from,-1,sizeof(from));
for(i=0;i<m;++i)
{
memset(used,0,sizeof(used));
if(match(i))
sum++;
}
printf("%d\n",m-sum);
}
return 0;
}