您的位置:首页 > 其它

poj 2060 Taxi Cab Scheme (最小路径覆盖)

2012-10-09 20:35 155 查看
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 }
int ans = get() ;

printf("%d\n",n - ans) ;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: