2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III
1119 AlvinZH's Fight with DDLs III
思路
难题,最小点覆盖。
分析题意,某一个任务,既可以在笔记本A的 \(a\) 模式下完成,也可以在笔记本B的 \(b\) 模式下完成。如果笔记本A处于x模式,那么所有可以在笔记本x模式的任务可以一起完成,B同理。这两句话作为题目核心,该如何转化呢?
对于每个任务对应的(a,b),我们把它映射到平面坐标当中,明显发现,此题和二营长,你他娘的意大利炮呢简直一模一样。其实就是一个最小点覆盖问题,也就是最大二分图匹配问题。
关于最小点覆盖问题为什么等价于最大二分图匹配,第五次讲解课上有证明,期末练习赛E题难题·AlvinZH的青春记忆III大家也遇到过,不知道你真的好好练习了吗?
采用经典的匈牙利算法,构建图时需要注意,由于笔记本AB最初都处于模式0,也就是说若a或b等于0,这个任务可以直接忽略。
分析
二分图匹配算法
1.匈牙利算法:其本质就是,有条件就上,没条件创造条件也要上。DFS与BFS都可,时间复杂度均为 \(O(V⋅E)\) 。实际对于稀疏图BFS更佳。
2.Hopcroft-Karp算法:匈牙利算法的改进版,每次寻找多条增广路径。时间复杂度可以到达 \(O(n^{0.5}*m)\) 。
3.Dinic算法:二分图匹配其实是一个最大流问题,Dinic是一种优化过的求解最大流算法。与朴素的FF算法(\(O(n*m^2)\))不同,其可以同时多路增广。求解二分图时,构建超级源点和超级汇点,匹配边权值为1,求最大流即可。理论最坏复杂度为 \(O(n^2m)\) ,稠密图时比匈牙利DFS快了不少。
参考博客:二分图;
匈牙利算法;
Hopcroft-Karp算法;
Dinic算法
参考代码
/*
Author: 朱辉(35)
Result: AC Submission_id: 514523
Created at: Mon Dec 25 2017 00:33:21 GMT+0800 (CST)
Problem: 1119 Time: 82 Memory: 3024
*/
#include <cstdio>
#include <cstring>
#include <vector>
#define MaxSize 10005
using namespace std;
int n, m, k;
vector<int> G[MaxSize];//邻接矩阵
int match[MaxSize];//记录匹配点
int visit[MaxSize];//记录是否访问
bool dfs(int x)//寻找增广路径
{
for (int i = 0; i < G[x].size(); ++i)
{
int to = G[x][i];
if(!visit[to])
{
visit[to] = 1;
if(!match[to] || dfs(match[to]))
{
match[to] = x;
return true;
}
}
}
return false;
}
int MaxMatch()
{
int ans = 0;
memset(match, 0, sizeof(match));
for (int i = 1; i <= n-1; ++i)
{
memset(visit, 0, sizeof(visit));//清空访问
if(dfs(i)) ans++;//从节点i尝试扩展
}
return ans;
}
int main()
{
while(~scanf("%d %d %d", &n, &m, &k))
{
for (int i = 0; i <= n; ++i)
G[i].clear();
int a, b;
for (int i = 1; i <= k; ++i) {
scanf("%d %d", &a, &b);
if(a*b != 0)
G[a].push_back(b);
}
printf("%d\n", MaxMatch());
}
}
2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III的更多相关文章
- 2016级算法期末上机-I.难题·ModricWang's Fight with DDLs III
1126 ModricWang's Fight with DDLs III 思路 由于题目中已经说明了时间经过了正无穷,因此初始位置是不重要的,并且每条边.每个点的地位是均等的.因此到达每个点的概率就 ...
- 2016级算法期末上机-F.中等·AlvinZH's Fight with DDLs II
1118 AlvinZH's Fight with DDLs II 思路 中等题,贪心. 理解题意,每次攻击中,可以使某个敌人生命值-1,自己生命值减去∑存活敌人总攻击力. 贪心思想,血量少攻击高的要 ...
- 2016级算法期末上机-D.简单·AlvinZH's Fight with DDLs I
1117 AlvinZH's Fight with DDLs I 思路 简单题,动态规划. 本题与期末练习赛B题很相似,而且更为简单些.简化问题:在数字序列上取数,不能取相邻的数. DP数组定义,dp ...
- 2016级算法期末上机-C.简单·Bamboo's Fight with DDLs III
简单·Bamboo's Fight with DDLs III 分析 一句话:贪心,简单哈夫曼应用,要求的其实是所有结点的值与权值的乘积之和,也就是带权路径长. 可以理解为非叶子节点的权值的和,这里的 ...
- 2016级算法期末上机-B.简单·ModricWang's Fight with DDLs I
1124 ModricWang's Fight with DDLs I 思路 这道题本质上就是一个多项式求值,题目中的n需要手动算一下,单位复根可以根据复数的性质来求,即\(e^{i\pi}+1=0\ ...
- 2016级算法期末上机-A.简单·Bamboo's Fight with DDLs I
简单·Bamboo's Fight with DDLs I 分析 一句话:要装满的完全背包问题. 对比完全背包只有一点要改变:初始化为负无穷 传送门: https://buaacoding.cn/pr ...
- 2016级算法期末上机-G.中等·Bamboo's Fight with DDLs II
中等·Bamboo's Fight with DDLs II 分析 一句话:给定字符串,求最长回文子序列长度,动态规划LCS思想的进阶应用 具体思路如下: 对于任意字符串,如果头尾字符相同,那么字符串 ...
- 2016级算法期末上机-E.中等·ModricWang's Fight with DDLs II
1125 ModricWang's Fight with DDLs II 思路 圆内被划分部分数的计算方式如下: 圆内部的每一个交点都使得总份数增加了一:除此之外,每一根直线段最后抵达圆周时,总份数也 ...
- 2016级算法期末模拟练习赛-F.AlvinZH的青春记忆IV
1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定 ...
随机推荐
- 接雨水12 · Trapping Rain Water12
[抄题]: Given n non-negative integers representing an elevation map where the width of each bar is 1, ...
- 解题报告-603. Consecutive Available Seats
Several friends at a cinema ticket office would like to reserve consecutive available seats. Can you ...
- Laravel 5.4 实现无限级分类
最近在工作中遇到一个需求,是要在laravel 5.4中实现无限级分类,但发现网上这个的资料较少,所以只能自己来实现了,下面这篇文章主要给大家介绍了关于在laravel 5.4中实现无限级分类的方法示 ...
- 1.oracle dblink(数据库不同实例数据对导)
.创建一个两个数据库之间的dblink,语法如下 create database link to_test connect to scott identified by tiger using '(D ...
- Facebook对MySQL全表扫描性能的改进
原文博客如下: http://yoshinorimatsunobu.blogspot.com/2013/10/making-full-table-scan-10x-faster-in.html 如下是 ...
- swoole多进程操作
多个任务同时执行 将顺序执行的任务,转化为并行执行(任务在逻辑上可以并行执行) 比如,我们要对已知的用户数据进行判断,是否需要发送邮件和短信,如果需要发送则发送. 不使用多进程时,我们首先判断是否发送 ...
- Restful风格wcf调用2——增删改查
写在前面 上篇文章介绍如何将wcf项目,修改成restful风格的接口,并在上面提供了查询的功能,上篇文章中也感谢园友在评论中的提的建议,自己也思考了下,确实是那个道理.在urltemplate中,定 ...
- 咏南中间件增加HTTPS.SYS支持
咏南中间件增加HTTPS.SYS支持 老客户可免费升级. HTTPS.SYS可以开发强大而稳定的REST SERVER. 微软在Windows Vista (server 2008) 以后使用http ...
- struct timeval 计时问题
linux编程中,如果用到计时,可以用struct timeval获取系统时间.struct timeval的函数原型如下: struct timeval { __kernel_time_t tv_s ...
- 在JS中简单实现Formatter函数
JS原生并没有提供方便使用的Formatter函数,用字符拼接的方式看起来混乱难读,而且使用起来很不方便.个人感觉C#里提供的语法比较好用,如: String.Format("Welcome ...