链接: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. windows下sqlite3的基本操作
  2. 运维的基本知识点及分类工作
  3. 如何应付表数据过大的查询问题?(如何尽量避免大表关联)[转]
  4. python字典添加列表_【Python】对字典列表进行去重追加
  5. java去除字符串的空格,换行符,水平制表符,回车
  6. 你需要administrators提供的权限才能删除_终于解决了:你需要来自XXX的权限才能对此文件进行更改
  7. IIS和APACHE共用80端口的方法
  8. php array 数组函数,php数组函数-array_地图()
  9. GNS3 使用错误 ( Dynamips error when running command 'nio create_udp )
  10. python乱码转中文_Python中文乱码问题(转)
  11. rqnoj 2 开心的金明
  12. 加权平均数的例子_加权平均值计算器
  13. 微型计算机鸡兔同笼,奥数鸡兔同笼问题
  14. Android TextView设置下划线
  15. 读《麦田里的守望者》(塞林格)
  16. 【打卡-Coggle竞赛学习2023年3月】对话意图识别
  17. 百融云创被传赴港IPO急辟谣 旗下信贷业务存众多质疑
  18. 动圈耳机振膜_小白大讲堂: 耳机振膜材料对音质的影响
  19. A4. MTK开机流程
  20. ChatGPT的悄然问世,让原先“吃香”的10种“铁饭碗”快要端不住了:软件技术类、新闻媒体类、法律工作类、市场研究分析师、教师、金融分析类、交易员、平面设计师、会计师、客服人员。

热门文章

  1. 索尼高清影视技术学院参观观后感
  2. android最简单的更换主题,教你更换Android手机主题
  3. lsof u mysql wc l_lsof命令详解
  4. 【编译器】VSCode配置Go语言开发环境
  5. 2020 CTF暑假夏令营培训Day2 密码学Crypto 部分笔记
  6. html怎么在jupyter编辑,jupyter home jupyter环境变量怎么设定
  7. 适合pythonpandas的软件_11个Python Pandas小技巧让你的工作更高效(附代码实例)
  8. JavaScript变量、属性、函数、方法的区别(1)
  9. JavaScript的Continue关键字和Break关键字
  10. PAT_1032验证身份(15)