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) ;
}
}
题意:
出租车公司有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) ;
}
}
相关文章推荐
- HDU3861(强连通+最小覆盖路径)
- poj3020Antenna Placement(最小路径覆盖)
- 【最小路径覆盖】【二分图】【最大流】【Dinic】bzoj2150 部落战争
- UVALive6571 It Can Be Arranged(最小路径覆盖)
- 网络流24题之最小路径覆盖问题(nefu481)
- 【二分图匹配(最小路径覆盖)】hdu 1151 Air Raid
- kuangbin专题十 POJ2594 (最小路径覆盖 + Floyd)
- poj 2594(可相交的最小路径覆盖)
- 最小路径覆盖(二分图最大匹配):Air Raid
- hdu1350 最小路径覆盖
- LOJ 6002「网络流 24 题」最小路径覆盖
- POJ 1548 Robots(最小路径覆盖)
- 【二分图+最小路径覆盖】北大 poj 3020 Antenna Placement
- poj 1422 最小路径覆盖
- HDU 1151 Air Raid(最小路径覆盖)
- poj 2060 最小路径覆盖
- SCU 4524 Division(强连通分量+缩点+最小路径覆盖)
- 最小路径覆盖,最小点覆盖,最大独立点集,最小边覆盖
- 【hdu1151】—Air Raid(最小路径覆盖)
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖