• 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 }

     

  • 相关阅读:
    影响CSS的margin合并的几个属性
    Mouse w/o Borders实现两台主机共用一套键鼠方法及问题处理
    隐藏"Input"标签默认样式
    如何快速开发网站?
    如何让Web.xml变得简洁?
    关于中文处理方面的研究
    Hello,World 百态
    UI开发的终极解决方案
    构建网络爬虫?so easy
    MDA数据校验规则定义
  • 原文地址:https://www.cnblogs.com/acSzz/p/2717326.html
Copyright © 2020-2023  润新知