poj2060Taxi Cab Scheme(二分图匹配)

 1 /*
 2    题意: 出租车 有一个出发的时间,从点(a, b)到点(c, d),时间为
 3    abs(a-c)+abs(b-d)! 一辆车可以在运完一个乘客后运另一个乘客,
 4    条件是此车要在预约开始前一分钟之前到达出发地, 问最少需要几辆车
 5    搞定所有预约。
 6
 7    思路:有向边进行建图,因为出发时间是升序的!
 8    t0: (a0, b0) ->(c0, d0)表示预约在t0时间出发从(a,b)到(c,d);//节点x
 9    t1:  (a1, b1) ->(c1, d1)表示预约在t1时间出发从(a1,b1)到(c1,d1);//节点y
10
11    如果可能的话从t0时间出发的车到达目的地后,如果满足从(c,d)到(a1,b1)
12    也就是从第一个目的地到达下一个出发地的时间t2 + 1<=t1, 那么完全就不用
13    其他的车再来了!两次的预约都搞定了!
14    如果满足的话,节点x 和 节点y建立一条有向边!
15    最后通过匈牙利算法搞定.....
16 */
17 #include<iostream>
18 #include<cmath>
19 #include<cstdio>
20 #include<cstring>
21 #include<algorithm>
22 #include<vector>
23 #define M 505
24 using namespace std;
25
26 struct point{
27    int x, y;
28    point(){}
29    point(int x, int y){
30       this->x=x;
31       this->y=y;
32    }
33    int operator -(point a)  {
34       return abs(x-a.x) + abs(y-a.y);
35    }
36 };
37
38 struct node{
39
40      int begin, end;
41      point s, d;
42 };
43
44 node nd[M];
45 vector<int>v[M];
46 int vis[M];
47 int link[M];
48
49 int n;
50
51 bool dfs(int cur){
52    int len=v[cur].size();
53    for(int i=0; i<len; ++i){
54        int u=v[cur][i];
55        if(vis[u]) continue;
56        vis[u]=1;
57        if(!link[u] || dfs(link[u])){
58           link[u]=cur;
59           return true;
60        }
61    }
62    return false;
63 }
64
65 int main(){
66    int t;
67    scanf("%d", &t);
68    while(t--){
69
70        scanf("%d", &n);
71        for(int i=1; i<=n; ++i){
72            int b, e, x1, y1, x2, y2;
73            scanf("%d:%d %d %d %d %d", &b, &e, &x1, &y1, &x2, &y2);
74            nd[i].begin=b*60+e;
75            nd[i].s=point(x1, y1);
76            nd[i].d=point(x2, y2);
77            nd[i].end=nd[i].begin+(nd[i].s-nd[i].d);
78        }
79        for(int i=1; i<n; ++i)
80           for(int j=i+1; j<=n; ++j){
81              if(nd[j].begin>=nd[i].end+(nd[i].d-nd[j].s)+1)//如果能够满足条件爱你到达另一个出发地点,两个节点之间建立一条有向边
82                 v[i].push_back(j);
83           }
84        int ans=0;
85        memset(link, 0, sizeof(link));
86        for(int i=1; i<=n; ++i){
87           memset(vis, 0, sizeof(vis));
88           if(dfs(i))  ++ans;
89        }
90        cout<<n-ans<<endl;
91        for(int i=1; i<=n; ++i)
92           v[i].clear();
93    }
94    return 0;
95 }

poj2060Taxi Cab Scheme(二分图匹配)

时间: 2024-10-05 05:07:19

poj2060Taxi Cab Scheme(二分图匹配)的相关文章

poj 2060 Taxi Cab Scheme (二分匹配)

Taxi Cab Scheme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5710   Accepted: 2393 Description Running a taxi station is not all that simple. Apart from the obvious demand for a centralised coordination of the cabs in order to pick up

POJ - 2060 Taxi Cab Scheme 二分图 最小路径覆盖

题目大意:有n项任务,给出每项任务的出发时间,出发地点和目的地. 当一个任务完成之后,如果 当前时间 + 到达另一个任务的出发地的时间 <= 另一个任务的出发时间 - 1 的话,那么就可以让这个人接下去完成这个任务了 问至少需要派多少人才可以完成任务 解题思路:这题和 poj-3216 Repairing Company很像 两个点集都是任务,如果一个任务完成了可以接下来完成另一个任务的话,那么这两个任务之间就存在关系了,这样二分图就建成了 因为要把所有的任务都完成,也就是说要覆盖所有点,这就变

UVA 1201 - Taxi Cab Scheme(二分图匹配+最小路径覆盖)

UVA 1201 - Taxi Cab Scheme 题目链接 题意:给定一些乘客,每个乘客需要一个出租车,有一个起始时刻,起点,终点,行走路程为曼哈顿距离,每辆出租车必须在乘客一分钟之前到达,问最少需要几辆出租车 思路:如果一辆车载完一个乘客a,能去载乘客b,就连一条有向边,这样做完整个图形成一个DAG,然后要求的最少数量就是最小路径覆盖,利用二分图最大匹配去做,把每个点拆成两点,如果有边就连边,做一次最大匹配,n - 最大匹配数就是答案 代码: #include <cstdio> #inc

二分图最小路径覆盖--poj2060 Taxi Cab Scheme

Taxi Cab Scheme 时间限制: 1 Sec  内存限制: 64 MB 题目描述 Running a taxi station is not all that simple. Apart from the obvious demand for a centralised coordination of the cabs in order to pick up the customers calling to get a cab as soon as possible,there is

hdu 1350 Taxi Cab Scheme(二分匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1350 Taxi Cab Scheme Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 943    Accepted Submission(s): 456 Problem Description Running a taxi stati

【图论】二分图匹配总结

二分图匹配总结 二分图匹配 1.二分图最大匹配.求两个集合内,每一个元素仅仅能用一次.两集合间存在一些匹配关系,求最大匹配多少对,利用匈牙利算法,对于每一个结点不断去找增广路去匹配 有几个重要性质: 1.最小点覆盖 = 最大匹配 2.最大独立集 = 总结点 - 最大匹配 模板: bool dfs(int u) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) continue; vis[v] = 1; i

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int inf=0x3f3f3f3f; 6 const int sink=30; 7 8 struct Edge 9 { 10 int to; 11 int next; 12 int capacity; 13 14 void assign(int t,int n,int c) 15 { 16 to=t; next=n; ca

棋盘游戏(二分图匹配)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3200    Accepted Submission(s): 1897 Problem Description 小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放

BZOJ 1854 游戏(二分图匹配或并查集)

此题的二分图匹配做法很容易想,就是把属性当做s集,武器当做t集,如果该武器拥有该武器则连一条边. 那么答案就是求该二分图的最大前i个匹配.将匈牙利算法改一改,当前找不到增广路就break. 但是过这个题需要常数优化,不能每次都fillchar一遍used数组.可以用队列将使用的used点加入,然后需要初始化的时候弹出即可. # include <cstdio> # include <cstring> # include <cstdlib> # include <i