layout: post

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

author: "luowentaoaa"

catalog: true

mathjax: true

tags:

- 二分图

- 图论

- 训练指南

- 最小路径覆盖


Taxi Cab Scheme

UVALive - 3126

题目大意:n个客人,从城市的不同位置出发,到达他们的目的地。已知每个人的出发时间hh:mm,出发地点(x1,y1)及目的地(x2,y2),要求使用最少的出租车接送乘客,使得每个顾客的要求都被执行,且每次出租车接客时需要至少提前一分钟到达乘客所在的位置。城区是网格型的,地址用(x,y)表示,出租车从(x1,y1)到(x2,y2)需要行驶|x1 - x2| + |y1 - y2|分钟。

题目分析:本题的模型是DAG上的最小路径覆盖。将每个客人视为一个节点,如果接送完顾客i后还可以继续接送顾客j,则对应DAG中的一条边i -> j。对每个节点拆点为i,i',如果图中存在有向边i -> j,则建边(i,j')。设二分图的最大匹配数为m,则结果即为n - m

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll mod=998244353;
  5. const int maxn=1e3+50;
  6. const ll inf=1e10;
  7. const ll INF = 1000000000;
  8. const double eps=1e-5;
  9. #define bug cout<<"bbibibibbbb="<<endl;
  10. /// 二分图最大基数匹配
  11. struct BPM{
  12. int n,m; /// 左右顶点个数
  13. int G[maxn][maxn]; /// 邻接表
  14. int left[maxn]; /// left[i]为右边第i个点的匹配点编号,-1表示不存在
  15. bool T[maxn]; /// T[i]为右边第i个点是否已标记
  16. int right[maxn]; /// 求最小覆盖用
  17. bool S[maxn]; /// 求最小覆盖用
  18. void init(int n,int m){
  19. this->n=n;
  20. this->m=m;
  21. memset(G,0,sizeof(G));
  22. }
  23. /* void AddEdge(int u,int v){
  24. G[u].push_back(v);
  25. }*/
  26. bool match(int u){
  27. S[u]=true;
  28. for(int v=0;v<m;v++){
  29. //int v=G[u][i];
  30. if(G[u][v]&&!T[v]){
  31. T[v]=true;
  32. if(left[v]==-1||match(left[v])){
  33. left[v]=u;
  34. right[u]=v;
  35. return true;
  36. }
  37. }
  38. }
  39. return false;
  40. }
  41. /// 求最大匹配
  42. int solve(){
  43. memset(left,-1,sizeof(left));
  44. memset(right,-1,sizeof(right));
  45. int ans=0;
  46. for(int u=0;u<n;u++){
  47. memset(S,0,sizeof(S));
  48. memset(T,0,sizeof(T));
  49. if(match(u))ans++;
  50. }
  51. return ans;
  52. }
  53. /// 求最小覆盖。X和Y为最小覆盖中的点集
  54. int mincover(vector<int>& X,vector<int>& Y){
  55. int ans=solve();
  56. memset(S,0,sizeof(S));
  57. memset(T,0,sizeof(T));
  58. for(int u=0;u<n;u++)
  59. if(right[u]==-1)match(u);
  60. for(int u=0;u<n;u++)
  61. if(!S[u])X.push_back(u);
  62. for(int v=0;v<n;v++)
  63. if(T[v])Y.push_back(v);
  64. return ans;
  65. }
  66. };
  67. BPM solver;
  68. int x1[maxn],yyy[maxn],x2[maxn],y2[maxn],t1[maxn],t2[maxn];
  69. int dist(int a,int b,int c,int d){
  70. return abs(a-c)+abs(b-d);
  71. }
  72. int main(){
  73. int T;
  74. scanf("%d", &T);
  75. while(T--) {
  76. int n;
  77. scanf("%d", &n);
  78. for(int i = 0; i < n; i++) {
  79. int h, m;
  80. scanf("%d:%d%d%d%d%d", &h, &m, &x1[i], &yyy[i], &x2[i], &y2[i]);
  81. t1[i] = h*60+m;
  82. t2[i] = t1[i] + dist(x1[i], yyy[i], x2[i], y2[i]);
  83. }
  84. solver.init(n, n);
  85. for(int i = 0; i < n; i++)
  86. for(int j = i+1; j < n; j++)
  87. if(t2[i] + dist(x2[i], y2[i], x1[j], yyy[j]) < t1[j]) solver.G[i][j] = 1; // 至少要提前1分钟到达
  88. printf("%d\n", n - solver.solve());
  89. }
  90. return 0;
  91. }

训练指南 UVALive - 3126(DAG最小路径覆盖)的更多相关文章

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

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

  2. uva1201 DAG 最小路径覆盖,转化为 二分图

    大白例题P356 你在一座城市里负责一个大型活动的接待工作.你需要去送m个人从出发地到目的地,已知每个人的出发时间出发地点,和目的地点,你的任务是用尽量少的出租车送他们,使得每次出租车接客人,至少能提 ...

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

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

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

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

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

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

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

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

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

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

  8. POJ 1422 DAG最小路径覆盖

    求无向图中能覆盖每个点的最小覆盖数 单独的点也算一条路径 这个还是可以扯到最大匹配数来,原因跟上面的最大独立集一样,如果某个二分图(注意不是DAG上的)的边是最大匹配边,那说明只要取两个端点只要一条边 ...

  9. Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配

    /** 题目:Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配 链接:https://vjudge.net/proble ...

随机推荐

  1. hdu DIY FLIGHT GAME (dfs)

    FLIGHT GAME Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total S ...

  2. FAQ: SNMP on NetScaler Appliance

    FAQ: SNMP on NetScaler Appliance https://support.citrix.com/article/CTX122436 https://docs.citrix.co ...

  3. wmic的用法

    原始文章链接:http://blog.sina.com.cn/s/blog_5fb265c70100w4d0.html 一.wmic的基本命令格式简析 经常看网上的相关资料的话,读者可能会对wmic有 ...

  4. POJ2406 Power Strings 【KMP 或 后缀数组】

    电源串 时间限制: 3000MS   内存限制: 65536K 提交总数: 53037   接受: 22108 描述 给定两个字符串a和b,我们定义a * b是它们的连接.例如,如果a =" ...

  5. 打造适合日常使用的ubuntu,以ubuntu 16.04.1 LTS为例(不涉及版本)

    因为调试些程序需要用到ubuntu,又不喜欢虚拟机,因此装了双系统,在这过程中因为各种原因ubuntu来回安装过好多次,每次安装到用得爽都要捣鼓很久,也算稍微有点经验心得,将ubuntu调教的过程写在 ...

  6. nodejs与sqlite

    //打开数据库var db = new sqlite3.Database('xx.db'); // 关闭数据库db.close(); db.run('xx');  // 数据库对象的run函数可以执行 ...

  7. 网络(bzoj 4538)

    Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有服 ...

  8. IntelliJ 创建main函数快捷

    今天偶然发现了IntelliJ中 创建main函数的快捷键,依次还有for循环,System.out.println(); 在编写代码的时候直接输入psv就会看到一个psvm的提示,此时点击tab键一 ...

  9. 【BZOJ3237】【AHOI2013】连通图 [CDQ分治]

    连通图 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input Output Sampl ...

  10. AtCoder Regular Contest 075 D Widespread

    题目传送门 这道题其实二分一下答案就okay了的 不过LL什么的有时候忘了加 被卡了下 #include<cstdio> #include<cstring> #include& ...