题意

给定一个有向图,在这个图上的某些点上放伞兵,可以使伞兵可以走到图上所有的点。且每个点只被一个伞兵走一次。问至少放多少伞兵。

思路

裸的最小路径覆盖。

°最小路径覆盖

【路径覆盖】在一个有向图G(V, E<u,v>)中,路径覆盖就是在图中找一些路经,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次);如果不考虑图中存在回路,那么每条路径就是一个弱连通子集. 【最小路径覆盖】最小路径覆盖就是找出最小的路径条数,使之成为G的一个路径覆盖. 【解法 && 路径覆盖与二分图匹配的关系】最小路径覆盖=|V|-最大匹配数,其中最大匹配数的求法是把G中的每个顶点pi分成两个顶点pi'与pi'',如果在p中存在一条pi到pj的边,那么在二分图G'中就有一条连接pi'与pj''的无向边;这里pi' 就是p中pi的出边,pj''就是p中pj 的一条入边;

代码

[cpp] #include #include #include #include #include #include #include #define MID(x,y) ((x+y)/2) #define MEM(a,b) memset(a,b,sizeof(a)) #define REP(i, begin, m) for (int i = begin; i < begin+m; i ++) using namespace std; const int MAXV = 1005; //N1+N2 vector adj[MAXV]; struct MaximumMatchingOfBipartiteGraph{ int vn; void init(int n){ //二分图两点集点的个数 vn = n; for (int i = 0; i <= vn; i ++) adj[i].clear(); } void add_uedge(int u, int v){ adj[u].push_back(v); adj[v].push_back(u); } bool vis[MAXV]; int mat[MAXV]; //记录已匹配点的对应点 bool cross_path(int u){ for (int i = 0; i < (int)adj[u].size(); i ++){ int v = adj[u][i]; if (!vis[v]){ vis[v] = true; if (mat[v] == 0 || cross_path(mat[v])){ mat[v] = u; mat[u] = v; return true; } } } return false; } int hungary(){ MEM(mat, 0); int match_num = 0; for (int i = 1; i <= vn; i ++){ MEM(vis, 0); if (!mat[i] && cross_path(i)){ match_num ++; } } return match_num; } void print_edge(){ for (int i = 1; i <= vn; i ++){ for (int j = 0; j < (int)adj[i].size(); j ++){ printf("u = %d v = %d\n", i, adj[i][j]); } } } }match; struct rides{ int begintime, endtime; int x1, y1, x2, y2; }r[MAXV>>1]; int main(){ //freopen("test.in", "r", stdin); //freopen("test.out", "w", stdout); int t; scanf("%d", &t); while(t --){ int n; scanf("%d", &n); match.init(2*n); REP(i, 0, n){ int hour, minute; scanf("%d:%d %d %d %d %d", &hour, &minute, &r[i].x1, &r[i].y1, &r[i].x2, &r[i].y2); r[i].begintime = hour * 60 + minute; r[i].endtime = r[i].begintime + abs(r[i].x2 - r[i].x1) + abs(r[i].y2 - r[i].y1); } REP(i, 0, n) REP(j, 0, n){ if (i == j) continue; if (abs(r[i].x2 - r[j].x1) + abs(r[i].y2 - r[j].y1) < (r[j].begintime - r[i].endtime)){ match.add_uedge(i, j+n); } } printf("%d\n", n-match.hungary()); } return 0; } [/cpp]

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114079.html

POJ 1422 Air Raid (最小路径覆盖)相关推荐

  1. (hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)

    题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  2. HDU - 1151 Air Raid(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个有向图,现在需要在不同的地方空降伞兵,保证所有伞兵沿着道路可以走完所有城市,求出最少伞兵的数量 题目分析:我们的目的是要用最少的路径覆盖所有顶点,换句话说就是二分 ...

  3. poj 2594 Treasure Exploration 最小路径覆盖

    题目链接:http://poj.org/problem?id=2594 建图很重要!!! 大致题意: 给出一个由n个顶点m条边组成的有向无环图.求最少可以同时存在多少路径,使得这些路径可以覆盖所有的点 ...

  4. POJ - 2594 Treasure Exploration(最小路径覆盖-二分图最大匹配+传递闭包)

    题目链接:点击查看 题目大意:给出一个有向图,现在需要让最少的机器人沿着图遍历所有点,求出最少需要机器人的数量,注意每个点可以重复遍历 题目分析:因为要遍历所有点,所以还是变成了二分图的最小路径覆盖问 ...

  5. POJ - 3020 Antenna Placement(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,图中'o'代表空地,'*'代表城市,现在需要给城市装无线网,每个无线网最多可以覆盖相邻的两个城市,问覆盖所有的城市最少需要装多少个无线网 题目分析: ...

  6. POJ 1422 Air Raid

    二分图的最少边匹配,即找出最少的边可以覆盖所有的点.用匈牙利算法找出最大匹配,则最终结果为:ans = 图的顶点数 - 最大匹配. 代码如下: 1 #include<iostream> 2 ...

  7. POJ Treasure Exploration 【DAG交叉最小路径覆盖】

    传送门:http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K To ...

  8. POJ 3216 Repairing Company【二分图最小路径覆盖】

    题意: 告诉你 Q 格街区,一共有 M d 个任务分布在这Q 个街区里面,知道了每个任务的开始时间和需要一个人的完成时间,   问最少需要派多少人才能做完所有的任务. 分析: 求二分图的最小路径覆盖, ...

  9. POJ 2594 Treasure Exploration (可相交最小路径覆盖)

    题意 给你张无环有向图,问至少多少条路径能够覆盖该图的所有顶点--并且,这些路径可以有交叉. 思路 不是裸的最小路径覆盖,正常的最小路径覆盖中两个人走的路径不能有重复的点,而本题可以重复. 当然我们仍 ...

最新文章

  1. Struts 2的输入校验(二)
  2. Linux系统中软件的“四”种安装原理详解:源码包安装、RPM二进制安装、YUM在线安装、脚本安装包...
  3. react如何通过shouldComponentUpdate来减少重复渲染
  4. 强势崛起的Python会在十年内取代Java吗?
  5. 机房管理系列之工作站
  6. dmidecode常用的查询
  7. python获取系统参数_python 常用系统参数
  8. 三星Galaxy S20 FE 5G正式在国内发布 售价4999元起
  9. 用html语言写一个环形,html5环形流程图可添加流程图代码
  10. 明尼苏达量表结果分析_MMPI明尼苏达多项人格心理测试量表结果分析
  11. 忆黄霑(文/林青霞)
  12. Mysql 面向企业级开发(一)
  13. 宁波市第32届中小学生程序设计竞赛(初中组) 母鸡下蛋
  14. 浅析LRU(K-V)缓存
  15. 刚子扯谈:一起聊聊微信这孙子
  16. 中文自然语言处理可能是 NLP 中最难的?
  17. 迪士尼举办“好奇无界:米奇艺术展”中国巡展;延安万达嘉华及万达锦华酒店在延安红街开业 | 全球旅报...
  18. python编程midi键盘按键错乱_键盘按键错乱怎么办?
  19. 拓嘉启远:拼多多价格体系有哪些需要了解的
  20. 诸神之战在星际争霸1的实现[001]AI游戏的发端

热门文章

  1. java 使按钮被选中_java – 让我的单选按钮在Android中被选中
  2. 图解C语言的希尔排序
  3. c语言malloc calloc,C语言内存管理:malloc、calloc、free的实现
  4. java递归api_javaAPI_IO流基础_递归使用
  5. 网站部署后无法访问sqlserver_.NET Core跨平台部署
  6. java 6 基础教程_Java小白入门教程(6)——循环语句
  7. 【渝粤教育】国家开放大学2018年春季 0471-21T畜牧学 参考试题
  8. 【渝粤题库】陕西师范大学200341实变函数作业(高起本、专升本)
  9. 业界对物联网技术最常见的三大误区解读
  10. linux connect 阻塞超时时间,在linux下玩转带有超时时间的connect函数