POJ 3041 Asteroids (对偶性,二分图匹配)
题目:POJ 3041 Asteroids http://poj.org/problem?id=3041
分析:
把位置下标看出一条边,这显然是一个二分图最小顶点覆盖的问题,Hungary就好。
挑战:
输出一组可行解。构造,已知二分图的两个点集U和V,s-U-V-t,在最大匹配的残留网络里,选从s出发能到达的V中的点
沿途可以到达的U集中的点的路径就都被覆盖了,然后在选择U集合中无法到达的点。对于二分图中任意一条边,其中必有一点属于U集合,
所以前面选出的点集S是一个覆盖。并且S中V和U对应的匹配边是相斥的,总数确实等于总匹配边数。(更具体的,可以想想U是怎么划分的。)
如果最大匹配数记为M,最小点覆盖记为C。那么的构造还可以说明M≥C。又因为匹配边是平行的,所以至少要M个点才能覆盖,C≥M。这样
就得出了M = C的结论。
Code
/********************************************************* * ------------------ * * author AbyssalFish * **********************************************************/ #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<queue> #include<vector> #include<stack> #include<vector> #include<map> #include<set> #include<algorithm> #include<cmath> using namespace std;typedef long long ll;const int maxn = 501, maxm = 1e4+1; int hd[maxn],to[maxm],nx[maxm],ec; #define eachEage int i = hd[u]; i; i = nx[i] void add(int u,int v) {nx[++ec] = hd[u];to[ec] = v;hd[u] = ec; }int link[maxn]; int vis[maxn], clk;bool dfs(int u) {vis[u] = clk;for(eachEage){int v = to[i], w = link[v];if(!w || (vis[w]!=clk && dfs(w))){link[v] = u;return true;}}return false; }//#define LOCAL int main() { #ifdef LOCALfreopen("in.txt","r",stdin); #endifint n,k; scanf("%d%d",&n,&k);for(int i = 0; i < k; i++){int r, c;scanf("%d%d",&r,&c);add(r,c);}int ans = 0;for(int i = 1; i <= n; i++){clk++;if(dfs(i)) ans++;}printf("%d\n", ans);return 0; }
转载于:https://www.cnblogs.com/jerryRey/p/4947414.html
POJ 3041 Asteroids (对偶性,二分图匹配)相关推荐
- POJ 2724 Purifying Machine (二分图匹配)
题意 给定m个长度为n的01串(*既表示0 or 1.如*01表示001和101).现在要把这些串都删除掉,删除的方法是:①一次删除任意指定的一个:②如果有两个串仅有一个字符不同,则可以同时删除这两个 ...
- POJ 3041 Asteroids 二分图匹配
以行列为点建图,每个点(x,y) 对应一条边连接x,y.二分图的最小点覆盖=最大匹配 //#pragma comment(linker, "/STACK:1024000000,1024000 ...
- POJ - 3041 Asteroids 二分图最小点覆盖
题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...
- POJ - 3041 Asteroids(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目分析:给出一个n*n的矩阵,其中有m个敌人,每一次操作可以清除某一列或某一行中的所有敌人,问若想清除所有敌人,至少需要多少次操作 题目分析:第一次见这种题,就是最小覆盖是要用最 ...
- poj 3041 Asteroids
这是一道二分匹配题,根据Konig定理:最大匹配数=最小覆盖数: 这里我们以行为左边,以列为右边建图,这样建好后,就是一个裸的二分匹配: View Code #include<iostream& ...
- POJ 3041 Asteroids (最小顶点覆盖)
题目类型 最小顶点覆盖 题目意思 给出最多10000个点的坐标 每次可以消除同一行的点或同一列的点 问至少要多少次才能把所有点都消除掉 解题方法 首先建图 每一个行号为一个点 每一个列号为一个点 那 ...
- POJ 3041 Asteroids(最小点覆盖)题解
题意:n*n的网格中有k个点,开一枪能摧毁一行或一列的所有点,问最少开几枪 思路:我们把网格看成两个集合,行集合和列集合,如果有点x,y那么就连接x->y,所以我们只要做最小点覆盖就好了. 参考 ...
- POJ 1325 Machine Schedule[二分图匹配*最小点覆盖]
题意: 两台机器,有 k 个工作,每个工作可以在 a 机器的 P 模式或在 b 机器的 q 模式下解决,两台机器初始状态为 0 模式,每台机器没变换一次模都要重启一次, 问至少重启多少次可以完成所有工 ...
- 【Step1】【二分图匹配】poj 1274-The Perfect Stall
题目链接 题目大意 输入数据中,第一行给出n,表示n个奶牛. 接下来n行,每行一个x,xi表示第i头奶牛可以选择x个谷仓中的一个进行匹配.接下来x个数,表示谷仓的编号(1~n之间) 一个谷仓也只能有一 ...
最新文章
- 恢复Win10照片查看器
- Enterprise Library 5.0 开发向导- 简介(1)
- java 连接kafka超时_java – Kafka KStreams – 处理超时
- 参数--argumengs
- C语言实例:3个数从小到大排序
- 算法—巧排扑克牌(C语言)
- android客户端在多个界面切换时保持socket的链接的实例
- pandas 0.22导入错误
- 怎么实现两周联动加减速_LOL:野辅联动成版本主旋律,三大辅助对线游走兼备...
- Bailian2766 最大子矩阵【最大子段和+DP】
- KmdKit4D 0.01正式版发布了(0.02版已放出)
- Jenkins-SCM
- 金蝶基础资料中物料信息中的计价方法详细解释!小白不能让客户虎住,多多了解
- 章节1 概述 - Segger SystemView使用手册(译文)
- java 汉字笔画_java如何获取笔画
- 03 关键测量指标——整体网络测量
- tensorrt部署YOLOv5模型记录【附代码,支持视频检测】
- 今天上班了,周末跟随公司组织的旅游去了四川省南充市阆中市参观了张飞庙了解了一下“张飞身葬阆中,头葬云阳”的故事。...
- PS学习笔记(05)
- php unix时间戳 秒,UNIX时间戳怎么在php项目中使用
热门文章
- Exam化的软件项目管理
- 分享Spring Cloud分布式微服务架构图
- HAProxy杂记(1)
- ul、li列表简单实用代码实例
- Haproxy+Percona-XtraDB-Cluster 集群
- 汇编题目:编写包含多个功能子程序的中断例程
- win8 关于Adobe CS6系列软件Patch覆盖失败的问题(Photoshop CS6、Adobe Illustrator CS6、Adobe Fireworks CS6)...
- 用JAI实现对TIF(TIFF)格式图片的合并
- Diango博客--9.归档、分类和标签页
- 深度学习之生成式对抗网络 GAN(Generative Adversarial Networks)