CTU 2017 J - Punching Power (二分图匹配)
题意:
公园管理层最终决定在公园的各个战略位置安装一些流行的拳击机。实际上,为了弥补以前缺少的机器,他们决定安装尽可能多的机器。令人惊讶的是,公园不会被新机器堵塞,因为对于机器的位置存在一些非常严重的法律限制。管理层已经标记了所有可能的拳击机位置以及它们在公园计划中的相应坐标。此外,他们还必须遵守制造商安全规则:任何两台拳击机之间的距离必须至少为1.3米。帮助管理层确定可安装在公园内的最大数量的装箱机。
分析:二分图匹配。给距离小于1.3的两个点建边,之后求最大匹配,每有一个匹配就说明有两个点相邻,所以答案是 n - 最大匹配数
代码:
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define lowbit(x) (x&(-x))
#define mem(a) memset(a,0,sizeof(a))
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);using namespace std;typedef pair<int,int> pii;
const int maxn = 2000 + 7 , inf = 0x3f3f3f3f ;
struct Node{int x,y;
}nodes[maxn];
int nxt[maxn*100],to[maxn*100],head[maxn*100];//数组开大会TLE
int vis[maxn],used[maxn];
int n,nEdge;void add(int u,int v){nxt[nEdge] = head[u];to[nEdge] = v;head[u] = nEdge++;
}
void read(){nEdge = 0;memset(head,-1,sizeof(head));mem(vis);mem(used);mem(nxt);mem(to);mem(nodes);for(int i=1;i<=n;i++)scanf("%d %d",&nodes[i].x,&nodes[i].y);
}
bool can(Node a,Node b){double x1 = 1.0*a.x;double y1 = 1.0*a.y;double x2 = 1.0*b.x;double y2 = 1.0*b.y;double res = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));if(res<=1.3) return true;return false;
}bool dfs(int u){for(int i = head[u];~i;i=nxt[i]){int v = to[i];if(!vis[v]){vis[v] = 1;if(!used[v]||dfs(used[v])){used[v] = u;used[u] = v;return true;}}}return false;
}int Hungary(){int res = 0;for(int i=1;i<=n;i++){mem(vis);if(!used[i]&&dfs(i)) res++;//这个地方要判断这个点是否被匹配了}return res;
}int main(){//FRER();while(~scanf("%d",&n)){read();for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(can(nodes[i],nodes[j])){add(i,j);add(j,i);}}}int ans = Hungary();printf("%d\n",n - ans);}}
转载于:https://www.cnblogs.com/seven7777777/p/10278703.html
CTU 2017 J - Punching Power (二分图匹配)相关推荐
- 二分图匹配匈牙利算法DFS实现
1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...
- poj1274(二分图匹配)
(一道基础的二分图匹配) 题目意思大概为N个牛和M个栅栏,一个牛和一个栅栏只能匹配一次,求最大匹配 直接套用二分图最大匹配模板即可 #include <iostream> #include ...
- poj2724(二分图匹配)
题目大概意思为有部分奶酪需要处理,若两个奶酪的二进制只有一位不同,则可以一起处理,问最少需要处理几次 题目思路: 将可以一起处理的两个奶酪用边连接在一起,相当于边只连接二进制中有偶数个1的奶酪和二进制 ...
- 算法模板——二分图匹配
实现功能为二分图匹配 原理:匈牙利算法,核心思想--匹配上了就配,没直接匹配上也要通过前面的腾出位置让这个匹配上(详见:趣写算法系列之--匈牙利算法) 本程序以Codevs2776为例 详见Codev ...
- BZOJ1433 [ZJOI2009]假期的宿舍 - 二分图匹配
题解 一道裸的二分图匹配,稍微有一点细节需要注意, 但是非常裸= = 本校并且住校的向自己的床和 自己认识的并且本校的人的床连边 离校的不需要向外连边 不是本校的就和自己认识的 并且是本校的人的床连边 ...
- POJ2536 二分图匹配
题意: 有n只老鼠,m个洞,每个洞最多可以藏一只老鼠,每个老鼠的移动速度都是v,给你他们的当前坐标,和洞的坐标,突然老鹰来了,他们必须在s秒内跑到一个洞藏起来,问你最少有多少只老鼠被抓走了. ...
- URAL 1721 Two Sides of the Same Coin(二分图匹配,输出匹配对象)
题意:给出n个人的信息,名字.特征.排名. 在排名相差2的前提下,特征为testdata可以与特征为statements的组队,特征为anything可以任何一人组队: 求最多匹配对数,并将每队名字输 ...
- zoj3988 二分图匹配
给一个数组,对于每两个数加起来为素数那么就是一个集合,求不超过k个集合的最多数是多少 解法:二分图匹配,先打素数筛,预处理边集,匹配完之后分两种情况k>匹配数,那么可以直接输出匹配数*2,否则可 ...
- AtCoder AGC037D Sorting a Grid (二分图匹配)
题目链接 https://atcoder.jp/contests/agc037/tasks/agc037_d 题解 这场D题终于不像AGC032D和AGC036D一样神仙了-- 还是可做的吧 虽然考场 ...
最新文章
- 使用Python+Pycaret进行异常检测
- 刚毕业的职场萌新应具备这9种技能
- 李备:期待移动端非线性自适应滤波器
- matlab中欠定方程组超定方程组_七年级下册第10章:认识二元一次方程组(1课时)...
- Error:java: 无效的目标发行版: 11解决方案
- origin如何绘制双y轴曲线_Origin用矩阵绘制多层曲面映射图
- 领域应用 | 人工智能+知识图谱:如何规整海量金融大数据?
- LeetCode-145:二叉树的后序遍历
- 2016.8-2017.1 六履带四摆臂移动机器人测控系统
- cisco CEF的一点概述
- VS2017适配版的 VA 安装教程
- 分布式:分布式系统的设计
- Real-Time Rendering——16.1 Sources of Three-Dimensional Data三维数据的来源
- IntelliJ IDEA使用记录:maven projects-compile提示【**类,找不到符号】
- App消息推送策略:推送用户感兴趣的内容
- 致移动开发的后10年
- 吴恩达:机器学习的六个核心算法
- 【计蒜客】蒜头君的旅游计划
- 【youcans 的 OpenCV 学习课】7. 空间域图像滤波
- Windows系统下CMD命令行切换目录文件