HDU 6808 Go Running(二分图最小顶点覆盖)
时间:2020-08-01
本文章向大家介绍HDU 6808 Go Running(二分图最小顶点覆盖),主要包括HDU 6808 Go Running(二分图最小顶点覆盖)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:给出N个元组(x, y)问最多需要多少个初始状态才能转移到这样,一个元组(x,y)可以一直向右转移(x+1, y+1)...(x+i, y+i)或者一直向左转移(x+i, y-i)。n<1e5, x,y<1e9
题解:选择最少的直线,能够包括所有给定的点(x,y),把斜率1和-1的直线分别作为二分图u,v部分,当前有(x,y)即对两条直线加边,求的即是二分图的最小顶点覆盖。
二分图最小顶点覆盖定义:假如选了一个点就相当于覆盖了以它为端点的所有边。最小顶点覆盖就是选择最少的点来覆盖所有的边。
HK算法:
#include <bits/stdc++.h> #define IO_read ios::sync_with_stdio(false);cin.tie(0) #define fre freopen("C:\\in.txt", "r", stdin) #define _for(i,a,b) for(int i=a; i< b; i++) #define _rep(i,a,b) for(int i=a; i<=b; i++) #define inf 0x3f3f3f3f #define lowbit(a) ((a)&-(a)) using namespace std; typedef long long ll; template <class T> void read(T &x) { char c; bool op=0; while(c=getchar(), c<'0'||c>'9') if(c=='-') op=1; x=c-'0'; while(c=getchar(), c>='0'&&c<='9') x=x*10+c-'0'; if(op) x=-x; } template <class T> void write(T x) { if(x<0) putchar('-'), x=-x; if(x>=10) write(x/10); putchar('0'+x%10); } const int maxn=1e5+5; unordered_map<int, int> line1, line2; int T, n; /* //hungry算法复杂度:VE TEL vector<int> g[maxn]; int un, vn; int linker[maxn], used[maxn]; bool dfs(int u) { for(auto &v: g[u]){ if(!used[v]){ used[v]=true; if(linker[v]==-1 || dfs(linker[v])){ linker[v]=u; return true; } } } return false; } int hungry() { int res=0; memset(linker, -1, sizeof(linker)); for(int u=1; u<=un; u++){ memset(used, 0, sizeof(used)); if(dfs(u)) res++; } return res; } */ // hk算法时间复杂度sqrt(V)*E vector<int> g[maxn]; int un, vn; int linker[maxn], used[maxn]; int mx[maxn], my[maxn], dx[maxn], dy[maxn], dis; bool search_path() { queue<int> que; dis=inf; memset(dx, -1, sizeof(dx)); memset(dy, -1, sizeof(dy)); for(int u=1; u<=un; u++){ if(mx[u]==-1) que.push(u), dx[u]=0; } while(!que.empty()) { int u=que.front(); que.pop(); if(dx[u]>dis) break; for(auto &v: g[u]){ if(dy[v]==-1){ dy[v]=dx[u]+1; if(my[v]==-1) dis=dy[v]; else dx[my[v]]=dy[v]+1, que.push(my[v]); } } } return dis!=inf; } bool dfs(int u) { for(auto &v: g[u]) { if(!used[v] && dy[v]==dx[u]+1){ used[v]=true; if(my[v]!=-1 && dy[v]==dis) continue; if(my[v]==-1 || dfs(my[v])){ my[v]=u, mx[u]=v; return true; } } } return false; } int hopcroft_karp() { int res=0; memset(mx, -1, sizeof(mx)); memset(my, -1, sizeof(my)); while(search_path()){ memset(used, 0, sizeof(used)); for(int u=1; u<=un; u++) if(mx[u]==-1 && dfs(u)) res++; } return res; } int main() { read(T); while(T--) { read(n); un=vn=0; _rep(i, 1, n) g[i].clear(); line1.clear(), line2.clear(); int x, y; _rep(i, 1, n){ read(x), read(y); int k1=y-x, k2=y+x; if(!line1[k1]) line1[k1]=++un; if(!line2[k2]) line2[k2]=++vn; g[line1[k1]].push_back(line2[k2]); } //printf("%d\n", hungry()); printf("%d\n", hopcroft_karp()); } return 0; }
原文地址:https://www.cnblogs.com/Yokel062/p/13416845.html
- 为网站开启Nginx缓存加速,支持html伪静态页面
- 解决WordPress升级4.2后调用国外图片导致大量404请求的问题
- JS代码实现浏览器网页标题的动态切换,略微提高网站粘性
- Go-List
- 分享张戈博客自用的php网址在线转换二维码的API源码
- zabbix agentd客户端插件Shell一键自动安装脚本
- SendCloud邮件队列状态和已使用额度的Python监控脚本
- linux/scp命令报“bash: scp: command not found lost connection”错误的解决办法
- bat/cmd批处理连接SqlServer数据库查询脚本
- 一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎
- 解决mstsc无法连接问题:由于没有远程桌面授权服务器可以提供许可证…
- Apache/Nginx伪静态规则匹配http://出现的问题与解决
- 微信文件微起底
- Go语言TCP Socket编程--1
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
- Python操作MySQL数据库的示例代码
- 解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
- PyCharm中配置PySide2的图文教程
- 浅析Python 简单工厂模式和工厂方法模式的优缺点
- thinkPHP利用ajax异步上传图片并显示、删除的示例
- 对python中list的五种查找方法说明
- Laravel框架查询构造器简单示例
- PHP调用微博接口实现微博登录的方法示例
- Python使用pyexecjs代码案例解析
- PHP抽象类与接口的区别实例详解
- laravel获取不到session的三种解决办法【推荐】
- php封装的pdo数据库操作工具类与用法示例
- 利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
- PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例