Taxi Cab Scheme HDU - 1350
原题链接
考察:二分图匹配
思路:
最小路径点覆盖.每个任务的接连完成构成一条简单路径,求最少的简单路径覆盖所有的任务点.
Code
#include <iostream>
#include <cstring>
using namespace std;
const int N = 510;
typedef pair<int,int> PII;
struct Node{
int t,sx,sy,x,y;
}node[N];
int n,h[N],idx,match[N];
bool st[N];
struct Road{
int to,ne;
}road[N*N>>1];
bool dfs(int u)
{
for(int i=h[u];~i;i=road[i].ne)
{
int v = road[i].to;
if(st[v]) continue;
st[v] = 1;
if(!match[v]||dfs(match[v]))
{
match[v] = u;
return 1;
}
}
return 0;
}
void add(int a,int b)
{
road[idx].to = b,road[idx].ne = h[a],h[a] = idx++;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
idx = 0;
for(int i=1;i<=n;i++)
{
h[i] = -1,match[i] = 0;
int hh,mm,sx,sy,x,y;
scanf("%d:%d%d%d%d%d",&hh,&mm,&node[i].sx,&node[i].sy,&node[i].x,&node[i].y);
int t = hh*60+mm;
node[i].t = t;
}
for(int i=1;i<=n;i++)
{
int cost = abs(node[i].sx-node[i].x)+abs(node[i].sy-node[i].y);
for(int j=i+1;j<=n;j++)
{
int c = abs(node[i].x-node[j].sx)+abs(node[i].y-node[j].sy);
if(node[i].t+c+cost<node[j].t) add(i,j);
}
}
int res = 0;
for(int i=1;i<=n;i++)
{
memset(st,0,sizeof st);
if(dfs(i)) ++res;
}
printf("%d\n",n-res);
}
return 0;
}