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 }

 

 

你可能感兴趣的:(Scheme)