链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054

题意:一个熊孩子玩策略游戏,他须要用最少的士兵守卫最多的道路。假设这个顶点有士兵。则和这个点相连的全部边都会被保护,问保护全部的道路最少须要的士兵数量。

思路:这实际上就是一个最小点覆盖,二分图的最小点覆盖 == 最大匹配,这不是一个二分图,我们把n个点扩成2 * n个。把他转换为二分图,最后最大匹配再除以2就是原图的最大匹配。

Hopcroft-Karp增广模板

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 1510
#define eps 1e-7
#define INF 0x3F3F3F3F      //0x7FFFFFFF
#define LLINF 0x7FFFFFFFFFFFFFFF
#define seed 1313131
#define MOD 1000000007
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1/*
二分图匹配(Hopcroft-Carp的算法)。

顶点下标从0開始 调用:res=MaxMatch(); Nx,Ny要初始化!!! 时间复杂大为 O(V^0.5 E) 适用于数据较大(点较多)的二分匹配 */ struct node{ int v,next; }edge[MAXN*MAXN]; int head[MAXN],cnt; int Mx[MAXN],My[MAXN],Nx,Ny; int dx[MAXN],dy[MAXN],dis; bool vis[MAXN]; void add_edge(int a,int b){ edge[cnt].v = b; edge[cnt].next = head[a]; head[a] = cnt++; } bool searchP(){ queue<int>q; dis = INF; memset(dx,-1,sizeof(dx)); memset(dy,-1,sizeof(dy)); for(int i = 0; i < Nx; i++) if(Mx[i] == -1){ q.push(i); dx[i] = 0; } while(!q.empty()){ int u = q.front(); q.pop(); if(dx[u] > dis) break; for(int i = head[u]; i != -1; i = edge[i].next){ int v = edge[i].v; if(dy[v] == -1){ dy[v] = dx[u] + 1; if(My[v] == -1) dis = dy[v]; else{ dx[My[v]] = dy[v] + 1; q.push(My[v]); } } } } return dis != INF; } bool DFS(int u){ for(int i = head[u]; i != -1; i = edge[i].next){ int v = edge[i].v; if(!vis[v] && dy[v] == dx[u] + 1){ vis[v] = 1; if(My[v] != -1 && dy[v] == dis) continue; if(My[v] == -1 || DFS(My[v])){ My[v] = u; Mx[u] = v; return 1; } } } return 0; } int MaxMatch(){ int res = 0; memset(Mx,-1,sizeof(Mx)); memset(My,-1,sizeof(My)); while(searchP()){ memset(vis,0,sizeof(vis)); for(int i = 0; i < Nx; i++) if(Mx[i] == -1 && DFS(i)) res++; } return res; } int main(){ int n,i,j; int a,m,b; while(scanf("%d", &n)!=EOF){ cnt = 0; memset(head,-1,sizeof(head)); for(i = 0; i < n; i++){ scanf("%d:(%d)", &a, &m); while(m--){ scanf("%d", &b); add_edge(a,b); add_edge(b,a); } } Nx = Ny = n; int ans = MaxMatch(); printf("%d\n", ans / 2); } return 0; }

转载于:https://www.cnblogs.com/gccbuaa/p/7112439.html

HDU--1054--Strategic Game【最小点覆盖】相关推荐

  1. hdu 1054 Strategic Game 最小点覆盖 = 最大二分匹配

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054 简单二分匹配,根据题意构造一个无向图.然后求最小点覆盖,然后扫描mark数组将曾经匹配的点所匹配 ...

  2. HDU 1054 Strategic Game 最小点覆盖

     最小点覆盖概念:选取最小的点数覆盖二分图中的所有边. 最小点覆盖 = 最大匹配数. 证明:首先假设我们求的最大匹配数为m,那么最小点覆盖必然 >= m,因为仅仅是这m条边就至少需要m个点.然后 ...

  3. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  4. hdu 1054 Strategic Game 二分图最小点覆盖

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意: 给出一个无向图,求最小点覆盖. 思路: 用网络流来做设立一个超级源点和一个超级汇点. 每 ...

  5. HDU——1054 Strategic Game

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个权值,-1表示该格子为警卫,否则表示该格子有宝物: 当前点的权值二进制为1的地方代表需要一个警卫(编号为二进制从右往左数的位置),警卫 ...

  7. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...

  8. hdu 1054 Strategic Game

    http://acm.hdu.edu.cn/showproblem.php?pid=1054 树形DP 主要是把思路屡清楚 选个根结点进行向下搜 每个点都有两种可能 放士兵还是不放 防止重复搜索就可以 ...

  9. HDU - 1054 Strategic Game (二分图匹配模板题)

    二分图匹配模板题 #include <bits/stdc++.h> #define FOPI freopen("in.txt", "r", stdi ...

  10. 【POJ - 1463】Strategic game (树上最小点覆盖,树形dp)

    题干: Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the ...

最新文章

  1. 【移动端最强架构】LCNet吊打现有主流轻量型网络(附代码实现)
  2. 十六进制转换为十进制的效率问题
  3. ubuntu运行docker报错:invalid mount config for type “bind“: field Source must not be empty.(没解决)
  4. android百度地图sdk定位权限,Android:使用百度地图SDK实现定位:下载SDK、申请密钥、动态获得Android权限...
  5. JAVA 15发布,越来越像C# ?9月排名,C#增幅狠甩JAVA
  6. JDK8的日期时间类2
  7. tez什么意思_传统数仓和大数据数仓的区别是什么?
  8. 电脑计算器_教训!19年中级败给了电脑计算器,CPA难道要步后尘?
  9. 易绍坤网络赚钱:淘宝客获取佣金网赚之路,该如何进行?
  10. Android 替换应用内so文件避免每次都要重新打包的麻烦
  11. PHP实现匿名聊天室
  12. sql和mysql的区别
  13. python3和5_Python3算法之五:最大子序和
  14. Oracle数据库练习题及答案大全(包含数据库脚本)
  15. 有关电子商务平台的个人学习总结
  16. ubuntu14.04安装gnu/emacs24
  17. java获取session失效时间_Java设置session超时(失效)的时间
  18. STM32按键控制LED灯(中断实现)
  19. 深圳Java培训:Java全链路面试题-第一阶段
  20. 调试微信 PC 端的内置浏览器界面

热门文章

  1. Linux 开发中的常用命令 ( Cygwin 环境也同样适用)
  2. datatable相同列合并_使用Power Query合并查询
  3. oracle dba 连不上,Oracle10g的DBA无法登录解决方案
  4. c语言,成绩输出直方图,编写一个程序,打印输入中单词长度的直方图
  5. 【CSP】第20届CCF CSP计算机软件能力认证划水贴
  6. 【NOIP2017】【Luogu3954】成绩(模拟)
  7. 【NOIP2001】【Luogu1029】最大公约数和最小公倍数问题(GCD,枚举)
  8. java认证框架_sa-token 一个的JavaWeb权限认证框架,强大、简单、好用
  9. python网络编程基础知识_python网络编程基础
  10. nginx location匹配除了一个路径_nginx部署React项目