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;
}
时间: 2024-10-31 10:04:01

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

二分匹配最大匹配的理解(附图解)

  定义 一个PXP的有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次):如果不考虑图中存在回路,那么每条路径就是一个弱连通子集. 由上面可以得出: 1.一个单独的顶点是一条路径: 2.如果存在一路径p1,p2,......pk,其中p1 为起点,pk为终点,那么在覆盖图中,顶点p1,p2,......pk不再与其它的顶点之间存在有向边. 路径

详解Android中Intent对象与Intent Filter过滤匹配过程_Android

如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

二分图最大匹配值的模板

/* ************************************************************************** //二分图匹配(匈牙利算法的DFS实现) //初始化:g[][]两边顶点的划分情况 //建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配 //g没有边相连则初始化为0 //uN是匹配左边的顶点数,vN是匹配右边的顶点数 //调用:res=hungary();输出最大匹配数 //优点:适用于稠密图,DFS找增广路,实现简洁易于

【二分匹配】HDU1068-Girls and Boys

说说什么是最大独立集 在二分图中, 独立集指的是两两之间没有边的顶点的集合, 顶点最多的独立集成为最大独立集. 二分图的最大独立集=节点数-最大匹配数 例子: 1 2 - 1' 3 - 2' 4 - 3'        4' 最大独立集=8-3=5. 最大独立集是1,2,3,4,4'   例题: Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

二分图 增广 标记问题

问题描述 二分图 增广 标记问题 一下代码是poj2446 最大二分图匹配的 问题在于加了一个ex做标记就wa了,我觉得当前增广失败,后面就不用再以这个点增广的,找不到的,有什么问题呢? 求指示 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,m,k; int num,num2; #define N

二分图最大匹配

一.理论准备         这两天看到了图论的二部图,闲着没事就水了一道.         先看增广路的定义:增广路,也称增广轨或交错轨: 若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径.         由增广路的定义可以推出下述三个结论: P的路径长度必定为奇数,第一条边和最后一条边都不属于M. 不断寻找增广路可以得到一个更大的匹配M',直到找不到更多的增广路,M为G的最大匹配当且仅当不存在M的增

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

追美眉的各种算法

动态规划 基本上就是说:你追一个美眉的时候,需要对该美眉身边的各闺中密友都好,这样你追美眉这个问题就分解为对其美眉朋友的问题,只有把这些问题都解决了,最终你才能追到美眉.因此,该问题适用于聪明的美眉,懂得"看一个人,不是看他如何对你,而是看他如何对他人."的道理,并且对付这样的美眉总能得到最优解.但确定是开销较大,因为每个子问题都要好好对待-- 贪心法 基本上就是:你追一个美眉的时候,从相识到相知,每次都采用最aggressive的方式,进攻进攻再进攻!从不采用迂回战术或是欲擒故纵之法

《WCF技术内幕》翻译18:第1部分_第4章_WCF101:从外部剖析WCF

尽管WCF是一个相当复杂的平台,但对于偶然的一个学习者来说它看起来还是 相当简单的.正如你在Hello WC例子里看到的一样,构建一个接受程序可以简化 为使用地址.绑定和契约配置一个或者多个终结点.构建一个发送程序可以简单 理解为使用一个地址.绑定和契约向接收终结点发送消息.如果我们要修改发送 者或者接收者的处理过程,我们可以随便这么做,使用我们自己的行为配置或者 使用WCF的自带行为(比如增加元数据支持).图4-1展示了Endpoints. addresses.bindings.contrac