大白例题P356 你在一座城市里负责一个大型活动的接待工作。你需要去送m个人从出发地到目的地,已知每个人的出发时间出发地点,和目的地点,你的任务是用尽量少的出租车送他们,使得每次出租车接客人,至少能提前一分钟达到他所在的位置,城市为网格 (x1,y1) ===>(x2,y2) 需要|x1-x2|+|y1-y2|分钟

题解:

本题的模型是DAG的最小路径覆盖。所谓最小路径覆盖就是在图中找尽量少的路径,使得每个结点恰好在一条路径上(话句话说,不同路径不能有公共点)。单独的节点也可以作为一条路径。

本题中“时间” 是一个天然的序, 因此可以构图如下: 每个客人是一个节点,如果同一个出租车在接完客人u以后来得及接客人v,离岸边u_>v, 不难发现是一个DAG, 并且它的最小 路径覆盖就是本题的答案。

大白书 P357讲解:DAG最小路径覆盖的解法把所有节点i 拆成 X 节点i  和Y 节点i' , 如果图G中存在有向边 i->j,则在二分图中引入i->j', 设最大匹配数位m,则结果就是 n-m.

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <vector>
  5. #include <cstdio>
  6. using namespace std;
  7. const int maxn =;
  8. struct person{
  9. int time;
  10. int sx,sy,tx,ty;
  11. }P[maxn];
  12. struct BPM{
  13. int n,m;
  14. int left[maxn],right[maxn];
  15. bool S[maxn],T[maxn];
  16. vector<int>G[maxn];
  17. void init(int n, int m){
  18. this->n = n;
  19. this->m = m;
  20. for(int i=; i<m; i++) G[i].clear();
  21. }
  22. void add_edg(int u, int v){
  23. G[u].push_back(v);
  24. }
  25. bool match(int u){
  26. S[u] =true;
  27. for(int i =; i<(int )G[u].size(); i++){
  28. int v = G[u][i];
  29. if(T[v] == false){
  30. T[v]=true;
  31. if(left[v]==- || match(left[v])){
  32. left[v]=u; right[u]=v;
  33. return true;
  34. }
  35. }
  36. }
  37. return false;
  38. }
  39. int solve(){
  40. memset(left,-,sizeof(left));
  41. memset(right,-,sizeof(right));
  42. int ans=;
  43. for(int u =; u<n; u++){
  44. memset(S,false,sizeof(S));
  45. memset(T,false,sizeof(T));
  46. if(match(u)) ans++;
  47. }
  48. return ans;
  49. }
  50. }solver;
  51. int main()
  52. {
  53. int cas;
  54. scanf("%d",&cas);
  55. for(int cc =; cc<=cas; ++cc){
  56. int m;
  57. scanf("%d",&m);
  58. for(int i=; i<m; i++){
  59. int th,tm;
  60. scanf("%d:%d%d%d%d%d",&th,&tm,&P[i].sx,&P[i].sy,&P[i].tx,&P[i].ty);
  61. P[i].time = th*+tm;
  62. }
  63. solver.init(m,m);
  64. for(int i=; i<m; i++){
  65. int a1 = abs(P[i].sx-P[i].tx)+abs(P[i].sy-P[i].ty);
  66. for(int j=; j<m; j++){
  67. int a2 = abs(P[i].tx-P[j].sx)+abs(P[i].ty-P[j].sy);
  68. if( (P[i].time+a1+a2) < P[j].time ){
  69. solver.add_edg(i,j);
  70. }
  71. }
  72. }
  73. printf("%d\n",m-solver.solve());
  74. }
  75. return ;
  76. }

uva1201 DAG 最小路径覆盖,转化为 二分图的更多相关文章

  1. 【LA3126 训练指南】出租车 【DAG最小路径覆盖】

    题意 你在一座城市里负责一个大型活动的接待工作.明天将有m位客人从城市的不同的位置出发,到达他们各自的目的地.已知每个人的出发时间,出发地点和目的地.你的任务是用尽量少的出租车送他们,使得每次出租车接 ...

  2. 训练指南 UVALive - 3126(DAG最小路径覆盖)

    layout: post title: 训练指南 UVALive - 3126(DAG最小路径覆盖) author: "luowentaoaa" catalog: true mat ...

  3. 1350 Taxi Cab Scheme DAG最小路径覆盖

    对于什么是DAG最小路径覆盖以及解题方法在我的另外的博客已经有了.http://www.cnblogs.com/Potato-lover/p/3980470.html 此题的题意: 公交车(出租车)车 ...

  4. bzoj 2044 三维导弹拦截——DAG最小路径覆盖(二分图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2044 还以为是CDQ.发现自己不会三维以上的…… 第一问可以n^2.然后是求最长不下降子序列 ...

  5. POJ1422 Air Raid 【DAG最小路径覆盖】

    Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6763   Accepted: 4034 Descript ...

  6. 【最小路径覆盖】【二分图】【最大流】【Dinic】bzoj2150 部落战争

    裸的最小路径覆盖. 把每个点拆点,变成二分图. 对于可以连边的点对(i,j):i->j'(1); 对于任意一点i,若i点为'.':S->i(1),i'->T(1); 答案为所有'.' ...

  7. hdu3861 The King’s Problem 强连通缩点+DAG最小路径覆盖

    对多校赛的题目,我深感无力.题目看不懂,英语是能懂的,题目具体的要求以及需要怎么做没有头绪.样例怎么来的都不明白.好吧,看题解吧. http://www.cnblogs.com/kane0526/ar ...

  8. HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)

    <题目链接> 题目大意: 一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.所有点只能属于一块区域:2,如果两点相互可达,则这两点必然要属于同一区域:3,区域内任意两点 ...

  9. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

随机推荐

  1. 查看UUID的方法

    # blkid /dev/sdc1: UUID="6dfada2a-3a79-46b9-8e5d-7e8b39eba0da" TYPE="ext4" /dev/ ...

  2. js的mime类型有哪些?

    js中的mime类型 常见类型 扩展名 类型/子类型 txt text/plain doc application/msword exe application/octet-stream pdf ap ...

  3. thinkphp---用事务处理批量操作

    我们在进行一些业务逻辑的时候,难免会出现批量操作的问题,特别是批量修改操作,如果数据量大,总会考虑到批量修改到一半怎么办?所以如果使用事务来进行批量操作就会好很多,直接看代码: public func ...

  4. 21ic编辑推荐:从单片机开始的程序运行

    一直不清楚单片机中程序的执行过程,就是知道一个程序总是从一个main函数开始执行,然后把程序段存放在ROM里面,动态数据存放在RAM里面,而单片机的RAM资源又是及其的稀少,所以要省着用,但是到底怎么 ...

  5. pandas numpy处理缺失值,none与nan比较

    原文链接:https://junjiecai.github.io/posts/2016/Oct/20/none_vs_nan/ 建议从这里下载这篇文章对应的.ipynb文件和相关资源.这样你就能在Ju ...

  6. C++/C, Java学习资料

    C++11系列-什么是C++11 [Java]Final 与 C++ Const的区别 C++开发者都应该使用的10个C++11特性 史上最明白的 NULL.0.nullptr 区别分析 C语言堆栈入 ...

  7. DBCP连接池配置(DBCPUtils.java)

    配置文件 db_dbcp.properites driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/db?useSSL= ...

  8. POJ-2353 Ministry(动态规划)

    Ministry Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4761 Accepted: 1528 Special Judg ...

  9. SQL Fundamentals || Single-Row Functions || 转换函数 Conversion function

    SQL Fundamentals || Oracle SQL语言   SQL Fundamentals: Using Single-Row Functions to Customize Output使 ...

  10. Oracle体系结构之控制文件的多路复用技术

    在Windows操作系统中,如果注册表文件被损坏了,就会影响操作系统的稳定性.严重的话,会导致操作系统无法正常启动.而控制文件对于Oracle数据库来说,其作用就好象是注册表一样的重要.如果控制文件出 ...