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;
}
posted @ 2021-07-15 09:25  acmloser  阅读(25)  评论(0编辑  收藏  举报