poj 2060 Taxi Cab Scheme (最小路径覆盖)

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         }
100         int ans = get() ;
101 
102         printf("%d\n",n - ans) ;
103     }
104 }

 

原文地址:https://www.cnblogs.com/acSzz/p/2717326.html