poj2060Taxi Cab Scheme(二分图匹配)

简介:

/*
   题意: 出租车 有一个出发的时间,从点(a, b)到点(c, d),时间为
   abs(a-c)+abs(b-d)! 一辆车可以在运完一个乘客后运另一个乘客, 
   条件是此车要在预约开始前一分钟之前到达出发地, 问最少需要几辆车
   搞定所有预约。
   
   思路:有向边进行建图,因为出发时间是升序的!
   t0: (a0, b0) ->(c0, d0)表示预约在t0时间出发从(a,b)到(c,d);//节点x 
   t1:  (a1, b1) ->(c1, d1)表示预约在t1时间出发从(a1,b1)到(c1,d1);//节点y 
   
   如果可能的话从t0时间出发的车到达目的地后,如果满足从(c,d)到(a1,b1)
   也就是从第一个目的地到达下一个出发地的时间t2 + 1<=t1, 那么完全就不用
   其他的车再来了!两次的预约都搞定了! 
   如果满足的话,节点x 和 节点y建立一条有向边!
   最后通过匈牙利算法搞定..... 
*/
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define M 505
using namespace std;

struct point{
   int x, y; 
   point(){}
   point(int x, int y){
      this->x=x;
      this->y=y;          
   }
   int operator -(point a)  {
      return abs(x-a.x) + abs(y-a.y);
   }
};

struct node{
       
     int begin, end;
     point s, d;    
};

node nd[M];
vector<int>v[M];
int vis[M];
int link[M];

int n;

bool dfs(int cur){
   int len=v[cur].size();
   for(int i=0; i<len; ++i){
       int u=v[cur][i];
       if(vis[u]) continue;
       vis[u]=1;
       if(!link[u] || dfs(link[u])){
          link[u]=cur;
          return true;             
       }
   }     
   return false;
}

int main(){
   int t;
   scanf("%d", &t);
   while(t--){
       
       scanf("%d", &n);
       for(int i=1; i<=n; ++i){
           int b, e, x1, y1, x2, y2;
           scanf("%d:%d %d %d %d %d", &b, &e, &x1, &y1, &x2, &y2);
           nd[i].begin=b*60+e;
           nd[i].s=point(x1, y1);
           nd[i].d=point(x2, y2);
           nd[i].end=nd[i].begin+(nd[i].s-nd[i].d);
       } 
       for(int i=1; i<n; ++i)
          for(int j=i+1; j<=n; ++j){
             if(nd[j].begin>=nd[i].end+(nd[i].d-nd[j].s)+1)//如果能够满足条件爱你到达另一个出发地点,两个节点之间建立一条有向边 
                v[i].push_back(j);
          }          
       int ans=0;
       memset(link, 0, sizeof(link));
       for(int i=1; i<=n; ++i){
          memset(vis, 0, sizeof(vis));
          if(dfs(i))  ++ans;     
       }
       cout<<n-ans<<endl;
       for(int i=1; i<=n; ++i)
          v[i].clear();
   }             
   return 0;    
}

目录
相关文章
|
5天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
305 116
|
20天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
503 45
Meta SAM3开源:让图像分割,听懂你的话
|
14天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
695 222
|
2天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
135 95
|
12天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1711 158