您的位置:首页 > 其它

POJ 2060 Taxi Cab Scheme

2013-11-19 16:15 295 查看
题目大意:

出租车公司有n个预约, 每个预约有时间和地点, 地点分布在二维整数坐标系上, 地点之间的行驶时间为两点间的曼哈顿距离(|x1 - x2| + |y1 - y2|)。一辆车可以在运完一个乘客后运另一个乘客, 条件是此车要在预约开始前一分钟之前到达出发地, 问最少需要几辆车搞定所有预约。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

const int N = 1000;

vector<int>g
;
int mylink
,vis
;

struct node
{
int start;
int a,b,c,d;
int end;
}t
;

int zheng(int x)
{
return x > 0 ? x : -x;
}

int dis(int a,int b,int c,int d)
{
return zheng(a - c) + zheng(b - d);
}

void init()
{
for( int i = 0 ; i < N; i ++ )
{
g[i].clear();
mylink[i] = -1;
}
}

bool DFS(int u)
{
for( int i = 0 ; i < g[u].size() ; i ++ )
{
int v = g[u][i];
if( !vis[v] )
{
vis[v] = 1;
if( mylink[v] == -1 || DFS(mylink[v]) )
{
mylink[v] = u;
return true;
}
}
}
return false;
}

int xiong(int n)
{
int ans = 0;
for( int i = 1 ; i <= n ; i ++ )
{
memset(vis,0,sizeof(vis));
if(DFS(i))
ans++;
}
return n - ans;
}

int main()
{
int T;
int i,j,n,h,m;
while(scanf("%d",&T)!=EOF)
{
while(T--)
{
init();
scanf("%d",&n);
for( i = 1 ; i <= n ; i ++ )
{
scanf("%d:%d",&h,&m);
scanf("%d%d%d%d",&t[i].a,&t[i].b,&t[i].c,&t[i].d);
t[i].start = h*60 + m;
t[i].end = t[i].start + dis(t[i].a,t[i].b,t[i].c,t[i].d);
for( j = i - 1 ; j > 0 ; j -- )
{
if( t[i].start >= t[j].end + dis(t[i].a,t[i].b,t[j].c,t[j].d) + 1 )
g[i].push_back(j);
}
}
printf("%d\n", xiong(n) );
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: