设为首页 加入收藏

TOP

UVA 1201 - Taxi Cab Scheme(二分图匹配+最小路径覆盖)
2015-07-20 17:45:44 来源: 作者: 【 】 浏览:2
Tags:UVA 1201 Taxi Cab Scheme 二分 匹配 最小 路径 覆盖

UVA 1201 - Taxi Cab Scheme

题目链接

题意:给定一些乘客,每个乘客需要一个出租车,有一个起始时刻,起点,终点,行走路程为曼哈顿距离,每辆出租车必须在乘客一分钟之前到达,问最少需要几辆出租车

思路:如果一辆车载完一个乘客a,能去载乘客b,就连一条有向边,这样做完整个图形成一个DAG,然后要求的最少数量就是最小路径覆盖,利用二分图最大匹配去做,把每个点拆成两点,如果有边就连边,做一次最大匹配,n - 最大匹配数就是答案

代码:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; const int N = 505; int t, n; struct People { int s, x1, y1, x2, y2; void read() { int h, m; scanf("%d:%d%d%d%d%d", &h, &m, &x1, &y1, &x2, &y2); s = h * 60 + m; } bool operator < (const People& c) const { return s < c.s; } } p[N]; vector
       
         g[N]; bool judge(People a, People b) { int tmp = a.s + abs(a.x2 - a.x1) + abs(a.y2 - a.y1) + abs(a.x2 - b.x1) + abs(a.y2 - b.y1); if (tmp < b.s) return true; return false; } int match[N], vis[N]; bool dfs(int u) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) continue; vis[v] = 1; if (match[v] == -1 || dfs(match[v])) { match[v] = u; return true; } } return false; } int hungary() { int ans = 0; memset(match, -1, sizeof(match)); for (int i = 0; i < n; i++) { memset(vis, 0, sizeof(vis)); if (dfs(i)) ans++; } return ans; } int main() { scanf("%d", &t); while (t--) { scanf("%d", &n); for (int i = 0; i < n; i++) { g[i].clear(); p[i].read(); } sort(p, p + n); for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) { if (judge(p[i], p[j])) g[i].push_back(j); } printf("%d\n", n - hungary()); } return 0; }
       
      
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU1588-Gauss Fibonacci(矩阵快.. 下一篇codeHaus XFire实现WebService开发

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·新书介绍《Python数 (2025-12-25 04:49:47)
·怎么利用 Python 进 (2025-12-25 04:49:45)
·金融界大佬力荐,Pyt (2025-12-25 04:49:42)
·你必须要弄懂的多线 (2025-12-25 04:22:35)
·如何在 Java 中实现 (2025-12-25 04:22:32)