poj2060Taxi Cab Scheme(二分图匹配)

简介: 1 /* 2 题意: 出租车 有一个出发的时间,从点(a, b)到点(c, d),时间为 3 abs(a-c)+abs(b-d)! 一辆车可以在运完一个乘客后运另一个乘客, 4 条件是此车要在预约开始前一分钟之前到达出发地, 问最少需要几辆车 5 搞定所有预约。
 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 }

 

目录
相关文章
|
机器学习/深度学习 人工智能 算法
|
负载均衡 监控 Dubbo
91.【SpringBoot-03】(二)
91.【SpringBoot-03】
141 0
|
11月前
|
存储 项目管理 数据库
6款适合团队使用的在线协作文档工具:功能、费用与特色对比
在数字化工作环境中,选择合适的在线协作文档工具对团队生产力至关重要。本文介绍了六款备受好评的工具:板栗看板、Google Docs、Microsoft OneNote、Notion、Dropbox Paper 和 Quip。从功能、费用到特色,全面对比分析,帮助企业管理者找到最适合团队需求的解决方案。
860 6
|
分布式计算 资源调度 Hadoop
Linux安装Hadoop(图文解说详细版)
Linux安装Hadoop(图文解说详细版)
Linux安装Hadoop(图文解说详细版)
|
运维 安全 算法
如何选择一块真正“好用的、性能高”的远程控制软件
从而影响工作。 - 当平台出现了故障,而运维却不在工位,也不在家中,手里没有电脑办公。 - 开发人员在公司、家写了某个功能的代码, 但是没有把代码传到正在使用的电脑上。 - 远程办公,家里有电脑,
338 0
 如何选择一块真正“好用的、性能高”的远程控制软件
|
监控 Shell 持续交付
强大的 Python 任务自动化工具!invoke 十分钟入门指南
invoke 是从著名的远程部署工具 Fabric 中分离出来的,它与 paramiko 一起是 Fabric 的两大最核心的基础组件。
677 0
|
SQL 存储 关系型数据库
PDO 事物功能|学习笔记
快速学习 PDO 事物功能,本节学习PDO的事物功能。MySQL学习中了解到MySQL支持事务操作,事务操作可以保证数据的完整性、事务的一些特性。PDO中也可以实现事务操作需求。
【错误记录】Google Play 上架报错 ( 对于在 APK 中使用该权限的应用,您必须设置隐私权政策 | 生成并托管 隐私政策 )(二)
【错误记录】Google Play 上架报错 ( 对于在 APK 中使用该权限的应用,您必须设置隐私权政策 | 生成并托管 隐私政策 )(二)
288 0
【错误记录】Google Play 上架报错 ( 对于在 APK 中使用该权限的应用,您必须设置隐私权政策 | 生成并托管 隐私政策 )(二)
|
弹性计算 运维 容灾
阿里云使用体验
经过进一步的体验云服务器我感受到阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了采购IT硬件的前期准备,就像是使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩,在使用期间给阿里云我最大的印象就是方便,快捷。使用界面简单明了,通过不断地尝试,我了解到了更多的特殊概念,专业名词,也了解到了如快照等容灾备份能力的实际用途,现实生活中,如果我们的电脑磁盘出现了故障,数据出现了损坏就无能为力了,或者只能够找专业的人把数据能够找回来,但是不能够保证说所有的数据都能找回来。
MATLAB对一组数据进行插值的方法
MATLAB对一组数据进行插值的方法