http://poj.org/problem?id=2060
题意:
出租车公司有n个预约, 每个预约有时间和地点, 地点分布在二维整数坐标系上, 地点之间的行驶时间为两点间的曼哈顿距离(|x1 - x2| + |y1 - y2|)。
一辆车可以在运完一个乘客后运另一个乘客, 条件是此车要在预约开始前一分钟之前到达出发地, 问最少需要几辆车搞定所有预约。
题解:
这道题很容易 看出来 求的就是一个 最小路径覆盖。
对于乘客 i 和 j 若 t[i] + 他们的距离 《 s[j] 则 i-> j;
建完图后求最小路径覆盖即可。
1 #include<cstdio>
2 #include<cstring>
3 #include<cmath>
4 #include<iostream>
5 #include<algorithm>
6 #include<
set>
7 #include<map>
8 #include<queue>
9 #include<vector>
10 #include<
string>
11
#define Min(a,b) a<b?a:b
12
#define Max(a,b) a>b?a:b
13
#define CL(a,num) memset(a,num,sizeof(a));
14
#define eps 1e-6
15
#define inf 10001000
16
17
#define ll __int64
18
19
#define read() freopen("data.txt","r",stdin) ;
20
const
double pi = acos(-
1.0);
21
const
int maxn =
510;
22
23
using
namespace std;
24
int n,m,k,num;
25
int head[maxn] ;
26
int result[maxn],vis[maxn] ;
27
int s[maxn],t[maxn] ,a[maxn],b[maxn],c[maxn],d[maxn];
28
struct node
29 {
30
int v;
31
int next;
32 }p[maxn*maxn];
33
int cnt ;
34
void add(
int u,
int v)
35 {
36 p[cnt].v = v;
37 p[cnt].next = head[u];
38 head[u] = cnt++ ;
39 }
40
bool find(
int u)
41 {
42
43
for(
int i = head[u];i!= -
1;i = p[i].next)
44 {
45
int v = p[i].v ;
46
if(!vis[v])
47 {
48 vis[v] =
1 ;
49
if(result[v] == -
1||find(result[v]))
50 {
51 result[v] = u;
52
return
true;
53 }
54 }
55 }
56
return
false ;
57 }
58
int
get()
59 {
60
int ans=
0;
61 CL(result,-
1);
62
for(
int i =
0;i < n;i++)
63 {
64 CL(vis,
0);
65
if(find(i))ans++;
66 }
67
return ans ;
68 }
69
char str[
100] ;
70
int main()
71 {
72
//
read() ;
73
int i,j,x,y,T;
74 scanf(
"
%d
",&T);
75
while(T--)
76 {
77 scanf(
"
%d
",&n);
78
79 CL(s,
0);
80 CL(t,
0) ;
81 num =
0 ;
82
for(i =
0 ; i< n;i++)
83 {
84
85 scanf(
"
%d:%d %d %d %d %d
",&x,&y,&a[i],&b[i],&c[i],&d[i]);
86 s[num] = x*
60 + y;
87 t[num] = s[num] + abs(c[i] - a[i]) + abs(d[i] - b[i]) ;
88 num++ ;
89
90 }
91 CL(head,-
1);
92 cnt =
0 ;
93
for(i =
0 ;i < n;i++)
94 {
95
for(j = i +
1;j < n;j++)
96 {
97
if(t[i] + abs(a[j] - c[i]) + abs(b[j] - d[i]) < s[j]) add(i,j) ;
98 }
99 }
100
int ans =
get() ;
101
102 printf(
"
%d\n
",n - ans) ;
103 }
104 }